如何在Python中保留異常裝飾器的堆疊跟蹤
在 Python 中,我們經常會使用裝飾器來對函式進行包裝,以便在函式呼叫前後執行一些額外的操作。當函式在裝飾器中丟擲異常時,預設情況下,堆疊跟蹤資訊將指向裝飾器函式,而不是實際引發異常的函式。這使得除錯和定位問題變得困難。
2、解決方案
為了保留異常裝飾器的堆疊跟蹤資訊,我們可以使用以下兩種方法:
-
使用
raise
語句的三引數形式
在 Python 2.x 中,我們可以使用
raise
語句的三引數形式來指定異常型別、異常例項和堆疊跟蹤資訊。例如:
class MyError( Exception):
pass
def try_except( fn):
def wrapped( * args, ** kwargs):
try:
return fn( * args, ** kwargs)
except Exception as e:
et, ei, tb = sys. exc_info()
raise MyError, MyError( e), tb
return wrapped
def bottom():
1 / 0
@try_except
def middle():
bottom()
def top():
middle()
>>> top()
Traceback ( most recent call last):
File "<stdin>", line 1, in < module >
File "tmp.py", line 24, in top
middle()
File "tmp.py", line 10, in wrapped
return fn( * args, ** kwargs)
File "tmp.py", line 21, in middle
bottom()
File "tmp.py", line 17, in bottom
1 / 0
__main__. MyError: integer division or modulo by zero
在上面的例子中,
try_except
裝飾器會捕獲函式
middle
中丟擲的異常,並使用
raise
語句的三引數形式重新丟擲異常。這樣,堆疊跟蹤資訊就會指向函式
bottom
,而不是函式
middle
。
-
使用
traceback
模組
在 Python 3 中,我們還可以使用
traceback
模組來獲取和操作堆疊跟蹤資訊。例如:
import sys
import traceback
class MyError( Exception):
pass
def try_except( fn):
def wrapped( * args, ** kwargs):
try:
return fn( * args, ** kwargs)
except Exception as e:
exc_type, exc_instance, exc_traceback = sys. exc_info()
formatted_traceback = ''. join( traceback. format_tb(
exc_traceback))
message = '\n{0}\n{1}:\n{2}'. format(
formatted_traceback,
exc_type. __name__,
exc_instance. message
)
raise MyError( message)
return wrapped
def bottom():
1 / 0
@try_except
def middle():
bottom()
def top():
middle()
>>> top()
Traceback ( most recent call last):
File "<stdin>", line 1, in < module >
File "tmp.py", line 24, in top
middle()
File "tmp.py", line 10, in wrapped
return fn( * args, ** kwargs)
File "tmp.py", line 21, in middle
bottom()
File "tmp.py", line 17, in bottom
1 / 0
__main__. MyError:
Traceback ( most recent call last):
File "tmp.py", line 17, in bottom
1 / 0
ZeroDivisionError: division by zero
在上面的例子中,
try_except
裝飾器會捕獲函式
middle
中丟擲的異常,並使用
traceback
模組獲取堆疊跟蹤資訊。然後,裝飾器會使用
raise
語句重新丟擲異常,並將堆疊跟蹤資訊作為異常訊息的一部分。這樣,堆疊跟蹤資訊就會指向函式
bottom
,而不是函式
middle
。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3006307/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python中的裝飾器Python
- python中裝飾器的原理Python
- 你真的會看異常堆疊資訊麼
- JVM異常不列印堆疊資訊 [ -XX:-OmitStackTraceInFastThrow ]JVMMITAST
- 如何在 Git 中取消檔案的跟蹤Git
- python中的裝飾器介紹Python
- 在SpringBoot中使用logback優化異常堆疊的輸出Spring Boot優化
- python的裝飾器Python
- python裝飾器2:類裝飾器Python
- 深入理解Python中的裝飾器Python
- Python 中的閉包與裝飾器Python
- 談一談Python中的裝飾器Python
- python中的裝飾器的使用實戰Python
- Python 裝飾器Python
- Python裝飾器Python
- python的裝飾器@的用法Python
- 使用log4j列印異常堆疊到日誌檔案
- 1.5.3 Python裝飾器Python
- Python 裝飾器(一)Python
- Python 裝飾器原理Python
- Python裝飾器模式Python模式
- Python中裝飾器語法詳解Python
- Python裝飾器的前世今生Python
- Python中裝飾器的基本概念和用法Python
- RxJava 異常時堆疊顯示不正確?解決方法都在這裡RxJava
- 巧用Grafana和Arthas自動抓取K8S中異常Java程式的執行緒堆疊GrafanaK8SJava執行緒
- python中contextmanager裝飾的方法PythonContext
- Python深入05 裝飾器Python
- python 之裝飾器(decorator)Python
- Python裝飾器詳解Python
- python幾種裝飾器的用法Python
- 瞭解python的裝飾器特性Python
- Python 工匠:使用裝飾器的技巧Python
- python裝飾器decorator的應用Python
- python的裝飾器和閉包Python
- python類裝飾器的使用注意Python
- JavaScript中的裝飾器--DecoratorJavaScript
- 華為裝置堆疊原理