1. ホーム
  2. python

[解決済み] Pythonで "内部例外"(トレースバック付き)?

2022-04-24 16:18:59

質問

私のバックグラウンドはC#で、最近Pythonでプログラミングを始めたところです。例外がスローされたとき、私は通常、完全なスタックトレースを表示しながら、より多くの情報を追加する別の例外でそれをラップしたいと思います。C#では非常に簡単ですが、Pythonではどうすればいいのでしょうか?

例えば、C#では次のようなことをします。

try
{
  ProcessFile(filePath);
}
catch (Exception ex)
{
  throw new ApplicationException("Failed to process file " + filePath, ex);
}

Pythonでも似たようなことができる。

try:
  ProcessFile(filePath)
except Exception as e:
  raise Exception('Failed to process file ' + filePath, e)

...しかし、これでは内部の例外のトレースバックが失われてしまいます!

編集してください。 例外メッセージとスタックトレースの両方を見て、両者を関連付けたいのですが。つまり、例外Xがここで発生し、次に例外Yがそこで発生したことを出力で見たいのです - C#の場合と同じです。これはPython 2.6で可能でしょうか?今のところ(Glenn Maynardの回答に基づいて)私ができる最善のことのように見えます。

try:
  ProcessFile(filePath)
except Exception as e:
  raise Exception('Failed to process file' + filePath, e), None, sys.exc_info()[2]

これにはメッセージとトレースバックの両方が含まれますが、トレースバックのどこでどの例外が発生したかは表示されません。

解決方法は?

Python 2

単純に、raiseの第3引数にトレースバックを渡すだけです。

import sys
class MyException(Exception): pass

try:
    raise TypeError("test")
except TypeError, e:
    raise MyException(), None, sys.exc_info()[2]

ある例外をキャッチして、別の例外を再度発生させる場合は、必ずこの操作を行います。