try/except/finally

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...')
本站公眾號
   歡迎關注本站公眾號,獲取更多信息