Python也不例外,跟其余高级语言同样,内置了一套try...except...finally...的错误处理机制
当认为某些代码可能会出错时,就能够用try来运行这段代码html
使用try时,要么except和finally至少要有一个存在,不然会没法经过编译python
捕获异常的意义在于,能够阻止程序意外停止,或以预想的方式停止,若是不捕获异常,错误会被解释器捕获,那么程序也就停止了函数
try...except...finally...机制spa
若是执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块
若是有finally语句块,执行完except后,则执行finally语句块,至此,执行完毕
无论有没有报错,finally下的语句都必定会被执行code
try: ...... except ZeroDivisionError as e: print('except:', e) finally: print('finally...')
错误的继承htm
Python的错误其实也是class,全部的错误类型都继承自BaseException
因此在使用except时须要注意的是,它不但捕获该类对应的错误,还会捕获其子类对应的错误
好比AError是BError的父类,若是except AError在先,except BError在后,
但若错误被except AError捕获,且该错误也属于BError,则该错误不会被except BError所捕获blog
Python全部的错误都是从BaseException类派生的
常见的错误类型和继承关系请参照连接:https://docs.python.org/3/library/exceptions.html#exception-hierarchy继承
try: ...... except ValueError as e: print('ValueError') except UnicodeError as e: #第二个except永远也捕获不到UnicodeError,由于UnicodeError是ValueError的子类,若是有,也被第一个except给捕获了 print('UnicodeError')
跨越多层调用io
使用try...except捕获错误还有一个巨大的好处,就是能够跨越多层调用
好比函数main()调用bar(),bar()调用foo(),若是foo()出错,则只要main()捕获便可
无需在每一个可能出错的地方去捕获错误,只要在合适的层次去捕获错误便可,所以大大减小了写try...except...finally的麻烦编译
def foo(s): return 10 / int(s) def bar(s): return foo(s) * 2 def main(): try: bar('0') except Exception as e: print('Error:', e) finally: print('finally...')