こんにちは、吉政創成 菱沼です。
今回もPythonエンジニア育成推進協会のPython 3 エンジニア認定実践試験の主教材「Python実践レシピ/技術評論社」を使って学習中です。
前回からChapter.3 Pythonの言語仕様の章に入り、例外処理の基本的な部分について学びました。
今回は、例外クラスの構造と、それを利用した例外の捕捉方法について学習します。
例外クラスの構造と継承範囲
例外クラスに関する前提からまずは確認していきます。
—————————
P.42
3.1.2 基底クラスで例外を捕捉する
例外を表すクラスは継承階層を構成しており、BaseExceptionを親としたExceptionクラスがあり、このExceptionを継承した形で、子・孫クラスの例外が存在しています。exceptに捕捉したい例外の基底クラスを指定して、その子・孫クラスの例外を捕捉できます。
—————————
Pythonの例外クラスは次のような構造で管理されているのだそうです。

Pythonの例外クラスは上の図のように階層構造で管理されているそうです。この階層の最上位にBaseExceptionという基底(親)クラスがあり、その直下にExceptionを含めたいくつかのクラスが入っています。引用文にあるExceptionはシステム終了に関する例外(SystemExitやGeneratorExitなど)を除いた一般的な例外(例:ValueError 、TypeError、FileNotFoundErrorなど)がまとまっているクラスです。
クラスは継承によって親クラスの性質が引き継がれるようになっています。
BaseExceptionから見たExceptionは子、Exceptionの下にあるValueErrorなどは孫という関係になりますので、例外処理をするtry-except文でBaseExceptionやExceptionを指定すると、子・孫クラスにある例外をすべて捕捉することができるそうです。
ただ、[ except BaseException: ]や[ except Exception: ]と指定してしまうと、例外の捕捉範囲が広くなりすぎてしまい、想定外の例外まで握りつぶしてしまう可能性があるため、実務では具体的な例外名を指定することが推奨されているようです。
try-except文で親クラスを指定して試してみよう。
という前提を踏まえ、ここでサンプルコードを見てみます。
—————————
P.43

—————————
上記のサンプルはZeroDivisionErrorを発生させるものになっていますが、try-except文で例外が発生してもプログラムを止めずに処理を継続させる、かつ、例外の種類と内容を表示させるようになっています。
対象としている例外クラスはArithmeticErrorで、ZeroDivisionErrorを直接的に指定していませんが、ZeroDivisionErrorはArithmeticErrorの子クラスなので、例外を捕捉することができます。
ちなみに、ArithmeticError は算術演算で発生する例外の基底クラスだそうです。ZeroDivisionError の他に、 OverflowError や FloatingPointError がここに含まれています。

それぞれの例外の詳細を知りたい方は以下のURLで一覧としてまとめられていましたので、ご参考にどうぞ。
少々短めですがきりが良いので、今回はこちらで終了です。お付き合いいただきありがとうございました。
実践試験について知りたい方は以下をご覧ください。
●Python3エンジニア認定実践試験