-异常通常出现的处理方式
·条件语句:if/else
·异常处理:try/except/else/finally
1.python中的异常和相关语法
·exception:python内置的异常类
·raise:抛出异常
·try:尝试运行以下语句
·except:在try语句之后,捕获某个异常,为空则捕获全部异常(很危险难以debug)
·else:在try语句之后,如果没有捕获到异常,则执行
·finally:在try语句之后,无论是否捕获到异常,均执行
1)
try: #尝试执行下面的语句
print("enter try")
except: #出现异常就捕获,这里是捕获全部异常(可以在except后面空格加具体异常)
print("enter except")
else: #没有出现异常则执行
print("enter else")
finally:
print("enter finally")
#以上,except和else只执行其一,finally永远最后执行
2)
try: #尝试执行下面的语句
print("enter try")
1 / 0
except ZeroDivisionError:
print("enter except ZeroDivisionError")
except ArithmeticError:
print("enter except ArithmeticError")
except:
print("enter except")
else: #没有出现异常则执行
print("enter else")
finally:
print("enter finally")
3)
MODE = 'DEBUG'
try:
print('enter try')
1 / 0
except Exception as e:
print("enter except")
if MODE == 'DEBUG':
raise #抛出异常,而且是执行完finally之后才抛出异常,因为一旦抛出异常程序就会中断
elif MODE == 'WARN':
print(e) #仅仅打印提示信息,不抛出异常。而且是先打印提示信息,再执行finally(因为程序不会中断)
else:
print("enter else")
finally:
print("enter finally")
2.异常的传播
def f1():
try:
return 1 / 0
except Exception as e:
print("This is f1.")
print(e)
raise
def f2():
try:
f1()
except Exception as e:
print("This is f2.")
print(e)
def f3():
try:
f2()
except Exception as e:
print("This is f3.")
print(e)
def main():
try:
f3()
except Exception as e:
print("This is main")
print(e)
if __name__ == "__main__":
try:
main()
except Exception as e:
print("this is __main__")
print(e)
以上代码输出结果:
This is f1
division by zero
This is f2.
division by zero
原因是:f1虽然捕获了异常,但是将其抛出了,抛出的异常又被f2给捕获了,而f2并未抛出,所以在之后都检测不到
如果所以函数都加上raise的话,但最后的__main__不加上,则所有函数都会打印相应的结果
如果连最后的__main__都加上raise的话,则直接traceback了,凉凉