异常是一种很“主观”的说法,以下雨为例,假设大家约好明天去爬山郊游,如果第二天下雨了,这种情况会打破既定计划,就属于一种异常;但对于正在期盼天降甘霖的农民而言,如果第二天下雨了,他们正好随雨追肥,这就完全正常。
很多时候,系统是否要引发异常,可能需要根据应用的业务需求来决定,如果程序中的数据、执行与既定的业务需求不符,这就是一种异常。由于与业务需求不符而产生的异常,必须由程序员来决定引发,系统无法引发这种异常。raise [exceptionName [(reason)]]
其中,用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述。如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。上面三种用法最终都是要引发一个异常实例(即使指定的是异常类,实际上也是引发该类的默认实例),raise 语句每次只能引发一个异常实例。
>>> raise
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
raise
RuntimeError: No active exception to reraise
>>> raise ZeroDivisionError
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
raise ZeroDivisionError
ZeroDivisionError
>>> raise ZeroDivisionError("除数不能为零")
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
raise ZeroDivisionError("除数不能为零")
ZeroDivisionError: 除数不能为零
try except
来捕获它。当然也可以不管它,让该异常向上(先调用者)传播,如果该异常传到 Python 解释器,那么程序就会中止。
- def main():
- try:
- # 使用try...except来捕捉异常
- # 此时即使程序出现异常,也不会传播给main函数
- mtd(3)
- except Exception as e:
- print('程序出现异常:', e)
- # 不使用try...except捕捉异常,异常会传播出来导致程序中止
- mtd(3)
- def mtd(a):
- if a > 0:
- raise ValueError("a的值大于0,不符合要求")
- main()
try except
来捕获异常,这样该异常将会被 except 块捕获;也可直接调用 mtd(3),这样该函数的异常就会直接导致程序中止。程序出现异常: a的值大于0,不符合要求
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\1.py", line 13, in <module>
main()
File "C:\Users\mengma\Desktop\1.py", line 9, in main
mtd(3)
File "C:\Users\mengma\Desktop\1.py", line 12, in mtd
raise ValueError("a的值大于0,不符合要求")
ValueError: a的值大于0,不符合要求
- 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
- if self.init_price > d:
- raise AuctionException("竞拍价比起拍价低,不允许竞拍!")
- initPrice = d
- def main():
- at = AuctionTest(20.4)
- try:
- at.bid("df")
- except AuctionException as ae:
- # 再次捕获到bid()方法中的异常,并对该异常进行处理
- print('main函数捕捉的异常:', ae)
- main()
转换出异常: could not convert string to float: 'df'
main 函数捕获的异常:<class 'ValueError'>
- 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("竞拍价比起拍价低,不允许竞拍!")
- initPrice = d
- def main():
- at = AuctionTest(20.4)
- try:
- at.bid("df")
- except AuctionException as ae:
- # 再次捕获到bid()方法中的异常,并对该异常进行处理
- print('main函数捕捉的异常:', ae)
- main()
raise AuctionException(e)
上面就是把原始异常 e 包装成了 AuctionException 异常,这种方式也被称为异常包装或异常转译。class AuctionException(Exception):
pass
联系客服