私はモジュールを作成していて、それが発生させる可能性のある例外の統一された例外階層を持ちたいと考えています (たとえば、すべてのモジュール固有の例外のFooError
抽象クラスからの継承)。foo
これにより、モジュールのユーザーはこれらの特定の例外をキャッチし、必要に応じて個別に処理できます。ただし、モジュールから発生する例外の多くは、他の例外が原因で発生します。たとえば、ファイルの OSError が原因でタスクに失敗した場合などです。
私が必要としているのは、キャッチされた例外を「ラップ」して、異なるタイプとメッセージを持つようにすることです。これにより、例外をキャッチしたものによって伝播階層のさらに上に情報が利用できるようになります。しかし、既存の型、メッセージ、およびスタック トレースを失いたくありません。問題をデバッグしようとしている人にとって、これはすべて有用な情報です。トップレベルの例外ハンドラーは役に立ちません。なぜなら、例外が伝播スタックのさらに上に行く前に例外をデコレートしようとしていて、トップレベルのハンドラーでは遅すぎるからです。
foo
これは、モジュールの特定の例外タイプを既存のタイプ (例: ) から派生させることで部分的に解決されclass FooPermissionError(OSError, FooError)
ますが、既存の例外インスタンスを新しいタイプでラップしたり、メッセージを変更したりすることは簡単ではありません。
Python のPEP 3134「Exception Chaining and Embedded Tracebacks」では、既存の例外の処理中に新しい例外が発生したことを示すために、Python 3.0 で受け入れられた例外オブジェクトの「連鎖」について説明しています。
私がやろうとしていることは関連しています:以前のPythonバージョンでも動作する必要があり、チェーンではなくポリモーフィズムにのみ必要です。これを行う正しい方法は何ですか?