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

