python异常处理
一、异常处理
-
程序在运行过程当中,不可避免的会出现一些错误(我们称其为异常),比如:使用了没有赋值过的变量、使用了不存在的索引、除数为0…
-
程序运行过程中,一旦出现异常将会导致程序立即终止,异常以后的代码全部都不会执行!
1.1、异常处理
程序运行时出现异常,我们可以编写代码(使用try,except,else,finally,raise)来对异常进行处理目的
异常类:Exception(所有异常的父类),子异常类包括IndexError(索引异常)、ZeroDivisionError(除0异常)等
-
try:将可能出错的代码放入到try语句,必不可少
- 如果代码有错误,则会执行except语句;
- 如果代码没有错误,则会跳过except语句,执行后面的语句;
-
except:如果出现错误,则会执行expect子句中的代码
- 如果except后不跟任何的内容(与后跟Exception效果相同),此时会捕获到所有的异常
- 如果在except后跟着一个特定的异常类型,那么此时只会捕获该类型的异常
- 可以在异常类后边跟着一个 as xx 作为异常的别名,此时xx就是异常对象
- raise:抛出异常,方便自定义异常信息
-
else:没出错时要执行的语句,可有可无
-
finally:该代码块总会执行,可有可无**(需要进行资源释放时,一般设置该语句)**
注意:except和finally至少要有一个 ,一般为except
print('异常出现前')
l = []
try:
# print(c) # 出现 NameError 异常
# l[10] # 出现 IndexError 异常
# 1 + 'hello' # 未知异常 unsupported operand type(s) for +: 'int' and 'str' <class 'TypeError'>
print(10/0) # 出现 ZeroDivisionError 异常
except NameError:
print('出现 NameError 异常')
except ZeroDivisionError:
print('出现 ZeroDivisionError 异常')
except IndexError:
print('出现 IndexError 异常')
except Exception as e :
print('未知异常',e,type(e))
finally :
print('无论是否出现异常,该子句都会执行')
print('异常出现后')
1.2、异常的传播(抛出异常)
当在函数中出现异常时
- 如果在函数中对异常进行了处理,则异常不会再继续传播;
- 如果没有对异常进行处理,则异常会继续向函数调用处传播,直到传递到全局作用域(主模块),如果依然没有处理,则程序终止,并且显示异常信息
当程序运行过程中出现异常以后,所有的异常信息会被保存一个专门的异常对象中
- 异常传播,实际上就是异常对象抛给了调用处
使用 raise 语句抛出异常
- raise语句后需要跟一个异常类或异常的实例
- 可以自定义异常类(自定义异常信息),只需要创建一个类继承Exception即可
class MyError(Exception):
pass
def add(a,b):
# 如果a和b中有负数,就向调用处抛出异常
if a < 0 or b < 0:
# raise用于向外部抛出异常,后边可以跟一个异常类,或异常类的实例
# raise Exception
# raise Exception('两个参数中不能有负数!')
raise MyError('自定义的异常')
r = a + b
return r
print(add(-123,456)) # __main__.MyError: 自定义的异常
def fn():
try:
print('Hello fn')
print(a)
except Exception as e:
raise Exception("函数fn发生异常:{}".format(e))
def fn2():
print('Hello fn2')
try:
fn()
except Exception as e:
print("函数fn2发生异常")
print(e)
fn2()
# 输出如下:
"""
Hello fn2
Hello fn
函数fn2发生异常
函数fn发生异常:name 'a' is not defined
"""