Python中異常鏈(Exception Chaining)的使用
基本概念
Python中有兩種異常鏈。
1、隱式異常鏈:當(dāng)在except塊中引發(fā)新異常時自動創(chuàng)建
2、顯式異常鏈:使用raise … from …語法顯式創(chuàng)建
隱式異常鏈
代碼示例:
try:
# 可能引發(fā)異常的代碼
1 / 0
except ZeroDivisionError:
# 在處理過程中又引發(fā)了新異常(主動拋出新異常)
raise ValueError("處理除零錯誤時出錯")
輸出會顯示
Traceback (most recent call last):
File "D:\PythonProject\Learn_250816\except_chain.py", line 3, in <module>
1 / 0
~~^~~
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\PythonProject\Learn_250816\except_chain.py", line 6, in <module>
raise ValueError("處理除零錯誤時出錯")
ValueError: 處理除零錯誤時出錯
顯式異常鏈(使用from)
代碼示例:
try:
1 / 0
except ZeroDivisionError as original_error:
raise ValueError("新錯誤") from original_error
輸出會顯示
Traceback (most recent call last):
File "D:\PythonProject\Learn_250816\except_chain.py", line 10, in <module>
1 / 0
~~^~~
ZeroDivisionError: division by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "D:\PythonProject\Learn_250816\except_chain.py", line 12, in <module>
raise ValueError("新錯誤") from original_error
ValueError: 新錯誤
禁用異常鏈
使用from None可以禁用異常鏈
try:
1 / 0
except ZeroDivisionError:
raise ValueError("新錯誤") from None
輸出只顯示新異常
Traceback (most recent call last):
File "D:\PythonProject\Learn_250816\except_chain.py", line 17, in <module>
raise ValueError("新錯誤") from None
ValueError: 新錯誤
訪問異常鏈
可以通過異常的__cause__和__context__屬性訪問異常鏈:
1、cause: 顯式使用from設(shè)置的異常
2、context: 隱式關(guān)聯(lián)的異常
測試代碼1:
try:
try:
1 / 0
except ZeroDivisionError as e:
raise ValueError("新錯誤") from e
except ValueError as ve:
print(f"當(dāng)前異常: {ve}")
print(f"顯式原因: {ve.__cause__}")
print(f"隱式上下文: {ve.__context__}")
輸出顯示1:
當(dāng)前異常: 新錯誤 顯式原因: division by zero 隱式上下文: division by zero
示例代碼2:
try:
try:
1 / 0
except ZeroDivisionError as e:
raise ValueError("新錯誤")
except ValueError as ve:
print(f"當(dāng)前異常: {ve}")
print(f"顯式原因: {ve.__cause__}")
print(f"隱式上下文: {ve.__context__}")
輸出顯示2:
當(dāng)前異常: 新錯誤 顯式原因: None 隱式上下文: division by zero
實際應(yīng)用場景
1.轉(zhuǎn)換異常類型
將底層異常轉(zhuǎn)換為更高級別的異常
try:
config = load_config()
except FileNotFoundError as e:
raise ConfigurationError("配置文件缺失") from e
2.添加上下文信息
try:
process_data(data)
except ProcessingError as e:
raise ProcessingError(f"處理ID為{data.id}的記錄時出錯") from e
3.屏蔽底層細節(jié)
try:
connect_to_database()
except DatabaseError:
raise ServiceUnavailableError("服務(wù)暫時不可用") from None
最佳實踐
1、使用raise … from …明確表達異常之間的關(guān)系
2、在需要屏蔽底層實現(xiàn)細節(jié)時使用from None
3、為自定義異常提供清晰的錯誤信息
4、在日志中記錄完整的異常鏈信息
到此這篇關(guān)于Python中異常鏈(Exception Chaining)的使用的文章就介紹到這了,更多相關(guān)Python 異常鏈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析如何使用python dotenv模塊管理環(huán)境變量
在開發(fā)Python應(yīng)用程序時,管理配置信息是一個常見的需求,本文主要來和大家講講通過python-dotenv模塊幫助我們輕松地從文件中讀取環(huán)境變量并在程序中使用,感興趣的可以了解下2025-05-05
Python?shapefile轉(zhuǎn)GeoJson的2種方式實例
geojson是地圖可視化系統(tǒng)中最常用的地理數(shù)據(jù)格式,幾乎所有主流地圖可視化庫或框架都支持geojson數(shù)據(jù)的加載,下面這篇文章主要給大家介紹了關(guān)于Python?shapefile轉(zhuǎn)GeoJson的2種方式的相關(guān)資料,需要的朋友可以參考下2023-03-03

