2009-12-11 21 views
8

私は例外が上向きに伝播するツールを構築しています。例外のコンテキストに関する新しいデータが例外に追加されます。問題は、例外が最上位レベルに達するまでに、余分なコンテキストデータがすべて存在しますが、最新のスタックトレースのみが表示されます。例外が、最後のスタックトレースの代わりにスローされた元のスタックトレースを表示する簡単な方法はありますか、または例外が伝播する最初のスタックトレースを取得するような何かを行う必要がありますか?例えばPython例外伝播

、次のコード:

def a(): 
    return UNBOUND 
def b(): 
    try: 
     a() 
    except Exception as e: 
     raise e 
b() 

は、次の例外を生成する:

理想的に、私は何とかユーザーにこの表示したい、
Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    b() 
    File "test.py", line 7, in b 
    raise e 
NameError: global name 'UNBOUND' is not defined 

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    File "test.py", line 2, in a 
    return UNBOUND 
NameError: global name 'UNBOUND' is not defined 

これはエラーが元々発生した行をユーザーに示します。

答えて

26

Pythonの例外はJavaのようなものですが、スタックを切り捨てずに例外を再現させる方法があります。

raiseを引数なしで使用してください。

e.args = ("hi!",) 
raise 

が実際に例外メッセージを変更します: - :結果それは例えば

Traceback (most recent call last): 
    File "./exc.py", line 11, in <module> 
    b() 
    File "./exc.py", line 7, in b 
    a() 
    File "./exc.py", line 4, in a 
    return UNBOUND 
NameError: global name 'UNBOUND' is not defined 

あなたはちょうどraiseその引数なしの場合でも、eオブジェクトに関するいくつかのことを変更することができます。スタックを破壊することなく、おそらく他のオプションもこのように変更できます。