程序在运行过程中不可避免出现一些错误 比如:使用了没有赋值的变量,或者是使用了不存在的索引… 这些错误在程序中我们就称之为异常 程序在运行过程中,一旦出现异常,程序立即终止,异常后面的代码都不会执行
处理异常 程序执行过程出现异常目的并不是要程序立即终止, python希望我们在出现异常时,我可以编写代码对异常进行处理
语法:(这里的异常类型是指异常类自带的异常类型,例如:NameError,ZeroDivisionError 等)
try 语句模板
try: 代码块(可能会出现错误的语句) except 异常类型 as 异常名: 代码块(出现错误后的处理方式) except 异常类型 as 异常名: 代码块(出现错误后的处理方式) except 异常类型 as 异常名: 代码块(出现错误后的处理方式) ... else 代码块(没有错误时执行的语句) finally: 代码块(是否异常都会执行)执行上面代码返回值: 10.0 程序没有错误,正常执行 hello
执行上面代码返回值: 出错了,哥们!!! hello
当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再传播 如果函数中没有对函数处理,则异常会继续向函数调用处传播 如果函数调用处处理了异常,则不会传播,如果没有处理则继续向调用处传播
直到传递到全局作用域,如果依然没有处理,则程序终止,并且显示异常信息
def fn(): print('hello.....') print(20/0)调用函数:fn() 出现异常信息: 下面try对异常处理:
try: fn() except: pass通过try … except 调用有异常的函数时,except 对异常进行处理
当程序运行中出现异常后,所有的异常信息会被专门保存到一个异常对象当中 而异常传播时,实际上就是异常对象抛给了调用处 NameError类,专门处理变量的错误
def fn(): print('hello fn') print(a) def fn2(): print('hello fn2') fn() # fn2() def fn3(): print('hello fn3') fn2() fn3()调用fn3()时,抛出异常: 可以看出异常逐级返回调用处fn3() -> fn2() -> fn() ->print(a) Traceback (most recent call last): hello fn3 File “G:/python/pycharmPro/异常.py”, line 88, in hello fn2 fn3() hello fn File “G:/python/pycharmPro/异常.py”, line 86, in fn3 fn2() File “G:/python/pycharmPro/异常.py”, line 82, in fn2 fn() File “G:/python/pycharmPro/异常.py”, line 78, in fn print(a) NameError: name ‘a’ is not defined
上面代码返回值: 出现NameError异常
上面代码返回值: 异常出现前 出现了异常 name ‘a’ is not defined <class ‘NameError’> 异常出现后
上面代码返回值: 异常出现前 #出现了异常 division by zero <class ‘ZeroDivisionError’> 无论是否出现异常都会执行 异常出现后
可以使用raise抛出异常 raise后面需要跟一个异常类或者异常实例 抛出异常的目的,就是告诉调用者这里调用时可能出现问题,希望你自己处理一下
print(add(1,-2)) 抛出异常信息:
自定义异常类,我们只需要继承Exception就可以了
class MyError(Exception): pass def add(a,b): #如果a b中有负数,就向调用出抛出一个异常 if a < 0 or b < 0 : raise MyError('自定义异常信息') r = a + b return r def main(): a = add(1, -2) print(a) if __name__ == '__main__': main()上面程序抛出自定义异常信息: