python raise 详解
raise 的作用
python使用raise可以使程序主动抛出异常,该异常可以被try语句所捕获
raise 的基本语法格式
该语句的基本语法格式为:raise [exceptionName [(reason)]]
raise 的基本用法
raise 语句有如下三种常用的用法:
- raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
- raise 异常类名称:raise 后带一个异常类名称。该语句引发指定异常类的默认实例。
- raise 异常类名称(描述信息):在引发指定异常的同时,附带异常的描述信息。
代码示例
try:
a = input("输入一个数:")
#判断用户输入的是否为数字
if(not a.isdigit()):
raise ValueError("a 必须是数字")
except ValueError as e:
print("引发异常:",repr(e))
当用户输入的不是数字时,程序会进入 if 判断语句,并执行 raise 引发 ValueError 异常。但由于其位于 try 块中,因为 raise 抛出的异常会被 try 捕获,并由 except 块进行处理
class AuctionException(Exception):
pass
class AuctionTest:
def __init__(self, init_price):
self.init_price = init_price
def bid(self, bid_price):
d = 0.0
try:
d = float(bid_price)
except Exception as e: # 此处只是简单地打印异常信息
print("转换出异常:", e) # 再次引发自定义异常
raise AuctionException("竞拍价必须是数值,不能包含其他字符!")
# raise AuctionException(e) #异常包装
if self.init_price > d:
raise AuctionException("竞拍价比起拍价低,不允许竞拍!")
print("竞拍成功!")
def main():
at = AuctionTest(20.4) #起拍价
a = input('请输入报价:')
try:
at.bid(a)
except AuctionException as ae: # 再次捕获到bid()方法中的异常,并对该异常进行处理
print('main函数捕捉的异常:', ae)
if __name__ == '__main__':
main()
raise AuctionException(e)
就是把原始异常 e 包装成了 AuctionException异常,这种方式也被称为异常包装或异常转译。
自定义异常类
很多时候,程序可选择引发自定义异常,因为异常的类名通常也包含了该异常的有用信息。所以在引发异常时,应该选择合适的异常类,从而可以明确地描述该异常情况。在这种情形下,应用程序常常需要引发自定义异常。
用户自定义异常都应该继承 Exception 基类或 Exception 的子类,在自定义异常类时基本不需要书写更多的代码,只要指定自定义异常类的父类即可。
下面程序创建了一个自定义异常类:
class AuctionException(Exception):
pass
上面程序创建了 AuctionException 异常类,该异常类不需要类体定义,因此使用 pass 语句作为占位符即可。
在大部分情况下,创建自定义异常类都可采用与上面程序相似的代码来完成,只需改变 AuctionException 异常的类名即可,让该异常的类名可以准确地描述该异常.
1、部分文章来源于网络,仅作为参考。 2、如果网站中图片和文字侵犯了您的版权,请联系1943759704@qq.com处理!