python——異常處理

所有異常類都是繼承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("有沒有異常都要執行的")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章