例外を発生させる

例外の送出

例えば、みなさんが作成した関数に対して適切な引数を設定してもらえなかったり、必要なリソースにアクセスできないような例外的な事象が想定される場合、必要に応じて例外を発生させる必要がでてきます。Pythonで例外を発生させるにはraise文を使用します。

例外発生
raise 発生させたい例外クラス or 例外オブジェクト

raiseの後には例外クラスでも例外オブジェクトでも指定できます。例外クラスが渡された場合は、自動的に引数無しのコンストラクタが呼び出されてインスタンス化されます。また、後ほど例示しますがasと合わせて例外オブジェクトに変数名を指定することができます。

以下のサンプルは独自関数内で例外を発生させるサンプルです。

def sample(num):
    if type(num)!=int:
        raise TypeError('パラメータが不正です')

    return num * 10

上のコードでは、整数を10倍するsample関数が用意されていますが、int型以外を引数に指定するとTypeErrorが発生します。また、引数で任意のメッセージを設定することが可能です。

例外の再送出

例外が発生したことをどこかに記録するだけで、その処理を処理するつもりがない場合はraiseを利用して補足した例外を再送出することができます。以下のコードのようにasで例外オブジェクトに別名を付加することが可能です。

x = 1000
y = 0

try:
    z = x / y
    print(z)
except ZeroDivisionError as e:
    print('除算に0が指定されました')
    raise e

上のコードではexceptで補足した例外にeという変数名を付与し、raiseで再送出しています。

独自例外の定義

前回、組み込みの様々な例外を紹介しましたが、それ以外にカスタマイズした例外を使用したい場合は、前のページでも少し触れましたが、Exceptionクラスを継承して独自例外を実装します。通常クラス名はErrorで終わるように命名するのが一般的です。

class ParamError(Exception):

    pass

def sample(num):
    if type(num)!=int:
        raise ParamError('パラメータが不正です')
 
    return num * 10

上のコードは先ほどの例外を独自例外に書き換えたものです。通常のクラスと同様、独自にメンバ変数やメソッドを実装することが可能ですので、必要に応じてカスタマイズしましょう。