簡體   English   中英

使用 python 回溯類型

[英]using the python traceback type

通過在處理異常時調用sys.exc_info()返回一個 3 元組,其中包含異常類、異常對象和回溯。

sys.exc_info的文檔也證明了這一點:

此函數返回一個包含三個值的元組,這些值提供有關當前正在處理的異常的信息。 ...返回的值是(type, value, traceback) ... traceback獲取一個 traceback 對象(參見參考手冊),它封裝了最初發生異常的點的調用堆棧。

我想使用用於在上述exc_info返回值中創建第三個變量的類型回溯,但找不到它的定義位置。

因此,我的問題是,可用於 python 腳本的traceback類型在哪里?

編輯:

我想使用traceback類型來定義 PyQt信號 PyQt 信號是通過指定信號名稱和傳遞的參數類型來定義的。 並不需要創建一個類型的對象,只有在類似的方式使用它isinstance調用。

壞消息,即使您可以像這樣獲得回溯對象的類:

import sys

try:
    raise Exception
except:
    tb = sys.exc_info()[2]

print(tb.__class__)

結果:

<class 'traceback'>

當你嘗試:

tb.__class__()

你得到:

TypeError: cannot create 'traceback' instances

所以回溯類型不能在外部實例化,可能是因為你需要訪問 python 內部來這樣做(並且屬性是只讀的,即使是tb_lineno所以也不可能“重用”一個實例)

您可以使用traceback.format_exc()sys.exc_info()像:

try:
    raise TypeError("Error !?!")
except Exception:
    print(traceback.format_exc())
    # or
    print(sys.exc_info()[2])

我看到標簽包含python2.7 ,問題很舊,所以很抱歉再次提出這個問題,但只想說在現代 Python 中,TracebackType 現在位於types模塊中:

>>> isinstance(sys.exc_info()[2], types.TracebackType))
True

雖然看起來類本身認為它有一個不同的名字:

>>> repr(sys.exc_info()[2].__class__)
<class 'traceback'>

真正有趣的是,雖然不是問題的主題,但對其中一個答案的解釋是,現在可以(自 Python 3.7 起)手動構建回溯。 這對於在異常中准確反映報告的回溯具有有趣的意義,並且與延遲/延遲/異步異常特別相關。 更改本身來自https://github.com/python/cpython/pull/4793 - 盡管如此,我還沒有看到任何好的文檔/示例。 請隨時對此類文章(或其他真正關心此問題的 StackOverflow 問題)發表評論。

這應該在 C 代碼中定義:

包含/traceback.h

#ifndef Py_LIMITED_API
typedef struct _traceback {
    PyObject_HEAD
    struct _traceback *tb_next;
    struct _frame *tb_frame;
    int tb_lasti;
    int tb_lineno;
} PyTracebackObject;
#endif

嗯..事實上,我不太確定你想做什么,所以不能幫助更多..

暫無
暫無

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

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