python異常捕獲

王獻運發表於2023-03-06

1、什麼是異常

異常就是錯誤的發生的訊號,如果此訊號不做處理,那麼,從本行開始之後的程式碼都不能正常執行了

如果發生了很多報錯,直接看最後一個報錯,最後一個一般可以找出直接報錯原因,如果還是找不到,那就依次往上看兩眼

錯誤總共分三類:

1、語法錯誤:是堅決不允許的,遇到之後要立即改正,否者,程式碼不能執行
    語法錯誤會在python編輯器內透過紅色波浪線標註在程式碼下

2、邏輯錯誤:是可以被允許的,但是我們寫邏輯的時候要儘可能的避免邏輯錯誤的發生
    程式執行結果和預期結果不一樣,說明程式中存在邏輯錯誤,如運算子使用不正確,語句順序不對,迴圈語句的起始值、終值或步長設定不對等。邏輯錯誤通常不會產生錯誤提示,只能根據執行結果知道程式中出現了錯誤。因此,這種錯誤較難被排除,需要仔細排查程式碼

邏輯上的錯誤

  • 錯誤發生的條件是可以預知的 --> if判斷

  • 錯誤發生的條件是無法預知的 --> 異常捕獲 try

    3、執行錯誤:執行錯誤是指python程式碼編譯透過,在執行程式碼時發生的錯誤
    python程式執行之中出現的錯誤就會導致整個程式都停止執行,像是條件判斷中符號左右兩邊資料型別不同、方法呼叫時的資料型別不同、開啟的檔案不存在以及索引越界和用0作為除數等等都是執行錯誤。而執行錯誤的特點就是無法被解析器找到,只有在執行時經過動態賦值才會出現。

Python全部的錯誤型別


錯誤型別——說明

ZeroDivisionError——除(或取模)零 (所有資料型別)

ValueError——傳入無效的引數

AssertionError——斷言語句失敗

StopIteration——迭代器沒有更多的值

IndexError——序列中沒有此索引(index)

IndentationError——縮排錯誤

OSError——輸入/輸出操作失敗

ImportError——匯入模組/物件失敗

NameError——未宣告/初始化物件 (沒有屬性)

AttributeError——物件沒有這個屬性

GeneratorExit——生成器(generator)發生異常來通知退出

TypeError——對型別無效的操作

KeyboardInterrupt——使用者中斷執行(通常是輸入^C)

OverflowError——數值運算超出最大限制

FloatingPointError——浮點計算錯誤

BaseException——所有異常的基類

SystemExit——直譯器請求退出

Exception——常規錯誤的基類

StandardError——所有的內建標準異常的基類

ArithmeticError——所有數值計算錯誤的基類

EOFError——沒有內建輸入,到達EOF 標記

EnvironmentError——作業系統錯誤的基類

WindowsError——系統呼叫失敗

LookupError——無效資料查詢的基類

KeyError——對映中沒有這個鍵

MemoryError——記憶體溢位錯誤(對於Python 直譯器不是致命的)

UnboundLocalError——訪問未初始化的本地變數

ReferenceError——弱引用(Weak reference)試圖訪問已經垃圾回收了的物件

RuntimeError——一般的執行時錯誤

NotImplementedError——尚未實現的方法

SyntaxError Python——語法錯誤

TabError——Tab 和空格混用

SystemError——一般的直譯器系統錯誤

UnicodeError——Unicode 相關的錯誤

UnicodeDecodeError——Unicode 解碼時的錯誤

UnicodeEncodeError——Unicode 編碼時錯誤

UnicodeTranslateError——Unicode 轉換時錯誤

以下為警告型別

Warning——警告的基類

DeprecationWarning——關於被棄用的特徵的警告

FutureWarning——關於構造將來語義會有改變的警告

OverflowWarning——舊的關於自動提升為長整型(long)的警告

PendingDeprecationWarning——關於特性將會被廢棄的警告

RuntimeWarning——可疑的執行時行為(runtime behavior)的警告

SyntaxWarning——可疑的語法的警告

UserWarning——使用者程式碼生成的警告

2、如果捕捉異常

如果我們想分別用不同的邏輯處理,需要用到多分支的except(類似於多分支的elif,從上到下依次匹配,匹配成功一次便不再匹配其他)

try: #異常的意思
  子程式碼1# 有可能會丟擲異常的程式碼
  子程式碼2
  子程式碼3
except 異常型別1 as e:	# as語法將異常型別的值賦值給變數e,這樣我們透過列印e便可以知道錯誤的原因
  pass
except 異常型別2 as e:
  pass
...
else:
  如果被檢測的子程式碼塊沒有異常發生,則會執行else的子程式碼
finally:
  無論被檢測的子程式碼塊有無異常發生,都會執行finally的子程式碼

  
# try不能和else單獨連用
# try 和 finally 連用,就算出了異常也先執行finally下程式碼塊再丟擲異常

如果我們想多種型別的異常統一用一種邏輯處理,可以將多個異常放到一個元組內,用一個except匹配。

try:
  被檢測的程式碼塊
except (NameError,IndexError,TypeError):
  觸發NameError或IndexError或TypeError時對應的處理邏輯

如果我們想捕獲所有異常並用一種邏輯處理,Python提供了一個萬能異常型別 Exception

try:
  被檢測的程式碼塊
except NameError:
  觸發NameError時對應的處理邏輯
except IndexError:
  觸發IndexError時對應的處理邏輯
except Exception:
  其他型別的異常統一用此處的邏輯處理

相關文章