Python——異常處理

yucheng1998發表於2019-08-04

異常處理

異常處理的基本結構如下:

try:
	可能發生異常的程式碼
except:
	異常處理程式碼
else:
	沒有發生異常時執行的程式碼
複製程式碼

else部分可以省略,如果使用這個子句,那麼必須放在所有的except子句之後。這個子句將在try子句沒有發生任何異常的時候執行。 try語句按照如下方式工作;

  • 首先,執行try子句(在關鍵字try和關鍵字except之間的語句)
  • 如果沒有異常發生,忽略except子句,try子句執行後結束。
  • 如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。如果異常的型別和 except 之後的名稱相符,那麼對應的except子句將被執行。最後執行 try 語句之後的程式碼。
  • 如果一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中。

一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多隻有一個分支會被執行。 處理程式將只針對對應的try子句中的異常進行處理,而不是其他的 try 的處理程式中的異常。 一個except子句可以同時處理多個異常,這些異常將被放在一個括號裡成為一個元組

異常處理並不僅僅處理那些直接發生在try子句中的異常,而且還能處理子句中呼叫的函式(甚至間接呼叫的函式)裡丟擲的異常。

使用except....as與統一處理 可以在except中同時指定多種異常,以便使用相同的異常處理程式碼進行統一處理。 在except語句中可以使用as為異常類建立一個例項物件,例如:

except(........)as exp
複製程式碼

異常型別:exp,__ calss__.__ name__ 異常資訊:exp 捕捉所有異常 except語句中沒有指明異常型別,則不管發生什麼型別的異常,均會執行except的程式碼。 而且有一個好處就是還可以進一步使用sys.exc_info()方法來獲取詳細異常資訊,例:

import sys
try:
    x=int(input("請輸入一個整數"))
except:
    print(sys.exc_info())
#q
#(<class 'ValueError'>, ValueError("invalid literal for int() with base 10: 'q'"), <traceback object at 0x00000146E5807C48>)
複製程式碼

丟擲異常

raise 唯一的一個引數指定了要被丟擲的異常。它必須是一個異常的例項或者是異常的類(也就是 Exception 的子類)。 如果你只想知道這是否丟擲了一個異常,並不想去處理它,那麼一個簡單的 raise 語句就可以再次把它丟擲。

try:
    raise NameError('HiThere')
except NameError:
    print('An exception flew by!')
    raise

複製程式碼