日々精進

新しく学んだことを書き留めていきます

exceptの中で例外をraiseする場合はfrom exを付ける

ライブラリがraiseした例外をexceptしてraiseし直す場合、以下のようにraise ~ from exのようにすると ライブラリがraiseした例外のスタックトレースやエラーメッセージも引き継ぐことができる。

            try:
                self._execute()
            except SQLAlchemyError as ex:
                raise ApplicationException() from ex

SQLAlchemyの例外をすべてcatchしたい場合は上記のように SQLAlchemyErrorで捕まえれば良いらしい。

from exを付けなくても、ライブラリがraiseした例外のスタックトレースはログに出る。 なぜかというと、from exをつけなくてもcontext にライブラリなどからraiseされた例外がセットされるため。

じゃあfrom exを付けなくてもいいかというとやっぱり付けた方が良い。
理由はfrom exを付けない場合、raiseした例外すべてのスタックトレースがログに出るが、出したくない場合もあるため。
例えば、日付文字列がyyyyMMdd形式であることをチェックするために「datetime.strptimeで文字列をparseして例外が出たらyyyyMMdd形式でないと判定する」
ロジックを実装することがある。そのように例外が出ても業務を継続していい場合は例外をログに出したくないので
ログに出す場合のみ明示的にfrom exを付ける方が良いと思われる。

参考:

docs.python.org

stackoverflow.com

stackoverflow.com