2011-01-19 11 views
14

いくつかの機能的な例外処理を行うコードがあり、すべて正常に動作しますが、例外が発生したときに例外が発生しますが、デバッグしているときには、かなり私は彼らにしたい。例外がPythonに渡される

例A:

>>> 3/0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ZeroDivisionError: integer division or modulo by zero 

例B:これらの例の両方で

>>> try: 3/0 
... except Exception as e: raise e 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
ZeroDivisionError: integer division or modulo by zero 

、例外は本当に我々が3/0を行おうと行1、で発生しますが、中後者の例では、2行目で発生したと言われています。

それは別の例外、次の出力を生成何かであるかのように、例外を発生させるためのPythonでの方法があります:あなたがキャッチされた例外を再上げるとき

>>> try: 3/0 
... except Exception as e: metaraise(e) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ZeroDivisionError: integer division or modulo by zero 

答えて

4

次のように、溶液はおよそ次のとおりです。

def getException(): 
    return sys.exc_info() 

def metaraise(exc_info): 
    raise exc_info[0], exc_info[1], exc_info[2] 

try: 3/0 
except: 
    e = getException() 
    metaraise(e) 

本の美しい部分は、あなたがして変数eの周囲を通過し、どこかにそれをmetaraiseことができるということですたとえ途中で他の例外が発生したとしても、

+1

しかし、新しいレイズの痕跡についての情報はありません。上記のキャッチャーは、例外が元の場所でのみ発生したと信じるためにだまされます。 2番目のライザーは存在を隠してしまい、デバッグのケースではかなり混乱することがあります。 – Alfe

17

を、などが

except Exception as e: raise e 

スタックトレースをリセットします。新しい例外を再発生させるのと同じです。何がしたいことはこれです:参考

except Exception as e: raise 
+1

この場合、変数に格納する必要はありません。 –

+0

それを何らかの形で変数に格納してどこかに渡す必要があることを除いて、最終的には呼び出されます。 –

+1

@Kevin Dolan:あなたのコードを理解しやすくし、デバッグ可能にしていますか、それとも難読化コンテストのエントリーですか? –

関連する問題