9

Python の一般的なパターンは、上流のモジュールでエラーをキャッチし、そのエラーをより有用なものとして再発生させることです。

try:
    config_file = open('config.ini', 'r')
except IOError:
    raise ConfigError('Give me my config, user!')

これにより、フォームのスタック トレースが生成されます。

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
__main__.ConfigError: Give me my config, user!

このようなスタック トレースを生成するために、ラップされた例外にアクセスする方法はありますか?

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
__builtin__.IOError: File Does not exist.
Exception wrapped by:
  File "<stdin>", line 4, in <module>
__main__.ConfigError: Give me my config, user!

編集:

私が打倒しようとしている問題は、一部のサードパーティ コードが例外を 3 回までラップできることであり、根本原因を特定できるようにしたいということです。つまり、例外スタックを検査して例外の根本原因を特定する一般的な方法です。サードパーティのモジュールにコードを追加する必要はありません。

4

2 に答える 2

10

これは例外チェーンとして知られており、Python 3 でサポートされています。

PEP 3134: http://www.python.org/dev/peps/pep-3134/

Python 2 では、exceptブロックに保存しない限り、新しい例外を発生させると古い例外が失われます。

于 2012-01-25T09:14:43.950 に答える
4

traceback モジュールを使用します。これにより、最新のトレースバックにアクセスして文字列に保存できます。例えば、

import traceback
try:
    config_file = open('config.ini', 'r')
except OSError:
    tb = traceback.format_exc()
    raise ConfigError('Give me my config, user!',tb)

「ネストされた」トレースバックは tb に保存され、ConfigError に渡されます。ここで、必要に応じて操作できます。

于 2012-01-25T03:34:19.223 に答える