文章目录
Python中的异常处理
异常Exception
- 错误Error
- 逻辑错误:算法写错了,例如加法写成了减法
- 笔误:例如变量名写错了,语法错误
- 函数或类使用错误,其实这也属于逻辑错误
总之,错误是可以避免的
- 异常 Exception
本意就是意外情况
这有个前提,没有出现上面说的错误,也就是说程序写的没有问题,但是在某些情况下,会出现一些意外,导致程 序无法正常的执行下去。
例如open函数操作一个文件,文件不存在,或者创建一个文件时已经存在了,或者访问一个网络文件,突然断网 了,这就是异常,是个意外的情况。
异常不可能避免 - 错误和异常
- 在高级编程语言中,一般都有错误和异常的概念,异常是可以捕获,并被处理的,但是错误是不能被捕获的。
- 一个健壮的程序应尽可能的避免错误,尽可能的捕获、处理各种异常。
产生异常
产生:
- raise 语句显示的抛出异常
- Python解释器自己检测到异常并引发它
def foo():
print("before")
print(1/0) #除零异常
print("after")
foo()
def bar():
print("before")
raise Exception("my exception") #使用raise主动抛出异常
print("after")
bar()
程序会在异常抛出的地方中断执行,如果不捕获,就会提前结束程序(其实是终止当前线程的执行)
异常的捕获
- 语法:
try:
<语句> # 带捕获异常的代码块
except <异常类型>:
<语句> #异常的处理代码块
except <异常类型> as <变量名>:
<语句> #异常的处理代码块
except:
<语句> #异常的处理代码块
else:
<语句> #如果没有异常发生,执行的代码
finally:
<语句> #退出try时总会执行
-
try的工作原理
- 如果try中语句执行时发生异常,搜索except子句,并执行第一个匹配该异常的except子句
- 捕获原则:从小到大,从具体到宽泛
- 捕获是从上到下依次比较,如果匹配,则执行匹配的except语句块
- 如果被一个except语句捕获,其他except语句就不会再次捕获了
- 如果没有任何一个except语句捕获到这个异常,则该异常向外抛出
- 如果try中语句执行时发生异常,却没有匹配的except子句,异常将被递交到外层的try,如果外层不处理这个异 常,异常将继续向外层传递。如果都不处理该异常,则会传递到最外层,如果还没有处理,就终止异常所在的线程
- 如果在try执行时没有发生异常,如有else子句,会执行else子句中的语句
- 无论try中是否发生异常,finally子句最终都会执行
- 如果try中语句执行时发生异常,搜索except子句,并执行第一个匹配该异常的except子句
-
as语句:声明一个名称指向被捕获的异常对象
-
raise语句
- raise后要求应该是BaseException类的子类或实例,如果是类,将被无参实例化。
- raise后什么都没有,表示抛出最近一个被激活的异常,如果没有被激活的异常,则抛类型异常。这种方式很少用
-
els子句:没有任何异常发生,则执行。
-
finally语句
- 最终,即最后一定要执行的,try…finally语句块中,不管是否发生了异常,都要执行finally的部分
- finally中一般放置资源的清理、释放工作的语句
-
异常中的return语句
- 示例:
def foo(): # return 1 try: return 3 finally: