簡體   English   中英

如何獲取 python 中嵌套異常的堆棧跟蹤?

[英]How to get the stack trace of a nested exeption in python?

如果引發異常,我想分析 python 中的堆棧跟蹤,它告訴您問題在源代碼文件中的確切位置。

當然,為此目的,存在模塊traceback 這適用於常規異常。 但是如果發生嵌套異常,你如何處理這種情況呢?

考慮這個例子:

def test():
    try:
        a = 0
        b = 5 / a
    except Exception as ee1:
        assert False

test()

此示例打印兩個異常:

Traceback (most recent call last):
  File "./test4d.py", line 12, in test
    b = 5 / a
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./test4d.py", line 18, in <module>
    test()
  File "./test4d.py", line 14, in test
    assert False
AssertionError

因此,解釋器知道有關這兩種異常的信息。 因此,我想從 Python 中檢索這兩條信息:assert 語句的堆棧跟蹤(此處用作示例導致異常)和除以零異常的堆棧跟蹤(此處用作示例導致異常)例外)。 我怎樣才能做到這一點?

問題的第二部分:我怎樣才能以結構化的方式做到這一點? 模塊traceback可用於獲取有關現有異常的更多信息。 但我不想打印異常,我想存儲它。 因此,我想將堆棧跟蹤作為一些 class 實例的元組,其中每個實例代表每個堆棧幀中的數據。 怎么做?

有一個名為__context__的變量與異常相關聯。 此變量可用於訪問嵌套異常。 看這個例子:

import traceback

def test():
    try:
        a = 0
        b = 5 / a
    except Exception as ee1:
        assert False

try:
    test()
except Exception as ee:
    print(repr(ee))
    stackTraceList = traceback.extract_stack(ee.__traceback__.tb_frame)
    del stackTraceList[0]
    for frame in stackTraceList:
        print("\t", frame)

    if ee.__context__:
        print(repr(ee.__context__))
        stackTraceList = traceback.extract_stack(ee.__context__.__traceback__.tb_frame)
        del stackTraceList[0]
        for frame in stackTraceList:
            print("\t", frame)

這將 output 以下文本:

AssertionError()
ZeroDivisionError('division by zero',)
     <FrameSummary file ./example.py, line 8 in test>

這表明可以識別這兩個異常並且可以迭代它們的堆棧跟蹤。

為方便起見,我實現了一個簡單的幫助模塊來處理名為jk_exceptionhelper的異常和堆棧跟蹤。 您可以使用pip安裝此模塊。 有關詳細信息,請查看 GIT 存儲庫: https://github.com/jkpubsrc/python-module-jk-exceptionhelper

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM