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...')