私はモジュールを書いていて、それが発生させることができる例外のために統一された例外階層を持ちたいと思っています(たとえばFooError
、すべてのfoo
モジュールの特定の例外の抽象クラスから継承する)。これにより、モジュールのユーザーはこれらの特定の例外をキャッチし、必要に応じてそれらを明確に処理できます。ただし、モジュールから発生した例外の多くは、他の例外のために発生します。たとえば、ファイルのOSErrorが原因であるタスクで失敗する。
必要なのは、キャッチされた例外を「ラップ」して、タイプとメッセージが異なるようにすることです。これにより、例外をキャッチしたものは何であっても、伝播階層のさらに上位で情報を利用できます。しかし、既存のタイプ、メッセージ、スタックトレースを失いたくありません。これは、問題をデバッグしようとしている人にとってすべての有用な情報です。トップレベルの例外ハンドラーは、伝播スタックをさらに上に行く前に例外を装飾しようとしているため、トップレベルのハンドラーが遅すぎるため、上手ではありません。
これは、モジュールfoo
の特定の例外タイプを既存のタイプ(例:)から派生させることで部分的に解決されclass FooPermissionError(OSError, FooError)
ますが、既存の例外インスタンスを新しいタイプでラップしたり、メッセージを変更したりすることは簡単ではありません。
PythonのPEP 3134「Exception Chaining and Embedded Tracebacks」では、既存の例外の処理中に新しい例外が発生したことを示すために、Python 3.0で「チェーン」例外オブジェクトとして受け入れられた変更について説明しています。
私がやろうとしていることは関連しています:以前のバージョンのPythonでも機能する必要があり、チェーニングのためではなく、ポリモーフィズムのためだけに必要です。これを行う正しい方法は何ですか?
except Exception as e
> raise type(e), type(e)(e.message + custom_message), sys.exc_info()[2]
-> この解決策は、別のSOの質問からのものです。これはきれいではありませんが機能的です。