所有異常類都是繼承Exception
Python 有兩種錯誤很容易辨認:語法錯誤和異常。
即便 Python 程序的語法是正確的,在運行它的時候,也有可能發生錯誤。
運行期檢測到的錯誤被稱爲異常。
大多數的異常都不會被程序處理,都以錯誤信息的形式展現在出來
捕獲簡單異常
try:
# 語句塊
#這裏放的是可能遇到異常的代碼
except:
# 異常處理代碼
# 遇到異常輸出的代碼
else:
# 沒有遇到異常時執行的代碼塊
finally:
# 無論有沒有異常都要執行的代碼
注:這個語法,不會分辨是什麼類型的異常,只要遇到異常就會執行except裏面的代碼塊
捕獲多個異常
try:
# 可能存在異常的代碼
except(異常名稱 1,異常名稱2,異常名稱3):
# 異常處理代碼
# 遇到異常時執行的代碼
else:
# 沒有遇到異常時執行的代碼塊
finally:
# 無論有沒有異常都要執行的代碼
注:這個語法只要遇到括號中的異常就執行except下的代碼塊,不會根據不同的異常執行不同的代碼
並且這個不區分優先級
分類處理多個異常
try:
可能存在異常的代碼
except (異常名稱1):
# 異常1的處理代碼
except (異常名稱2):
# 異常2的處理代碼
else:
# 沒有遇到異常時執行的代碼塊
finally:
# 無論有沒有異常都要執行的代碼
這個是有優先級的
執行try下的語句,如果引發異常,則執行過程會跳到第一個except語句。
如果第一個except中定義的異常與引發的異常匹配,則執行該except中的語句。
如果引發的異常不匹配第一個except,則會搜索第二個except,允許編寫的except數量沒有限制。
如果所有的except都不匹配,則異常會傳遞到下一個調用本代碼的最高層try代碼中。
主動觸發異常(拋出異常)
語法
raise [Exception [,args ] [,traceback]]
Exception是 異常的類型(例如ValueError),
參數是一個異常參數值。該參數是可選的,如果不提供,異常的參數是"None(空)" 就是異常錯誤信息
最後一個參數是跟蹤異常對象,也是可選的
列子:
def not_zero(num):
try:
if num == 0:
raise Exception('參數錯誤')
return num
except Exception as e :
print(e) # 打印異常錯誤信息
not_zero(0)
返回異常發生位置
先導入traceback庫
使用traceback.format_exc()函數或者 traceback.print_exc()
format_exc()返回字符串
print_exc()則直接給打印出來
使用案例:
import traceback
try:
t=0
if t==0:
raise Exception('t==0了',)
except Exception as c:
print(c)
traceback.print_exc()
else:
print("沒有異常執行")
finally:
print("有沒有異常都要執行的")
自定義異常
可以通過創建一個新的異常類來擁有自己的異常。
異常類繼承自 Exception 類,可以直接繼承,或者間接繼承
import traceback
class dj(Exception):
def __init__(self,value):
self.value=value
def __str__(self):
return repr(self.value)
# 注:repr()函數簡單來說就是轉字符串的
try:
3/0
except dj as c:
print(c)
traceback.print_exc()
else:
print("沒有異常執行")
finally:
print("有沒有異常都要執行的")