資格スワイプ
入出力・エラーと例外・クラス・標準ライブラリ・対話環境(7,8,9,10,14章)

次のように例外クラスの継承関係が定義されているとき、except節を記述する順序として正しいものはどれか。 class AppError(Exception): pass class ValidationError(AppError): pass

  • Aexcept節はクラスの継承関係に関係なく、記述した順序に意味はない
  • BAppErrorとValidationErrorは兄弟クラスなので、どちらを先に書いても捕捉される例外は変わらない
  • Cexcept AppError: を先に、except ValidationError: を後に書く(この順序ではValidationErrorが送出されても常にAppError側で捕捉される)
  • ✓except ValidationError: を先に、except AppError: を後に書く(より限定的な例外クラスを先に判定させる必要があるため)

解説

except節は上から順に評価され、最初にマッチしたものが実行される。ValidationErrorはAppErrorのサブクラスであるため、AppErrorを先に書くとValidationErrorも常にそちらで捕捉されてしまい、後段のexcept ValidationError節に到達しない。したがってより限定的なサブクラスを先に書く必要がある。

根拠8章 エラーと例外(複数のexcept節と例外クラスの階層)

← 前の問題次の問題 →
スワイプでまとめて流す