Pythonで複数の例外を補足する方法を解説する

スポンサーリンク

Pythonは常にExceptionベースのモデルで動作しています。

つまり、プログラムの実行中に発生したエラーはすべてExceptionとして渡され、プログラマに返され、Exception Handlingの技術を使って適宜処理されるかもしれません。

時には、制御の流れによって、1つのプロセスで複数の例外が発生する可能性があります。

そのため、このプログラム/関数では複数の例外をキャッチする必要があるかもしれません。

Pythonで複数の例外を処理する方法について説明します。

スポンサーリンク

複数の例外をキャッチする

Pythonでは、2つの方法で複数の例外を処理することができます

複数のExceptブロックを使用する

複数の例外をキャッチするには、すべての例外に対応する except ブロックを順次記述していきます。

擬似コードは以下のようになります。

try:
    pass
except Exception1:
    pass
except Exception2:
    pass

例題を通して、この処理方法を理解してみましょう。

以下の関数は + 演算子を使ってリストのすべての項目を足そうとし、また、いずれかの整数の項目が 200 未満であるかどうかをチェックするものです。

型が異なると加算や連結に失敗することがあるので、複数の例外が発生する可能性があります。

input_list_1 = ['Hello', ' from', 123, 456, ' Python']
input_list_2 = [123, 456, ' Python']
 
def add_list(ip):
    # Adds all items of a list
    # Will raise ValueError if any integer item > 200
    # and will raise TypeError if addition operands are of different types
    if isinstance(ip, list):
        result = '' if isinstance(ip[0], str) else 0
        for item in ip:
            if isinstance(item, int) and item > 200:
                raise ValueError('Integer Item has to be <= 200')
            result = result + item
        return result
    else:
        return None
 
try:
    # Will raise TypeError
    res = add_list(input_list_1)
    print(res)
except TypeError as te:
    print(type(te), te)
except ValueError as ve:
    print(type(ve), ve)
 
try:
    # Will raise ValueError since 456 > 200
    res = add_list(input_list_2)
    print(res)
except TypeError as te:
    print(type(te), te)
except ValueError as ve:
    print(type(ve), ve)

この関数は2つのリストに対して実行され、1つの関数から複数の例外が発生しうることを示します。

結果は以下の通りです。

<class 'TypeError'> can only concatenate str (not "int") to str
<class 'ValueError'> Integer Item has to be <= 200

シングルエクセレントブロックの使用

複数の例外に対して同じ動作をさせたい場合は、1 つの except ブロックで複数の例外をキャッチすることもできます。

これはコードの無駄な重複を避けることができ、複数の例外に対して同じ出力をすることでプログラマの時間を節約することができます

同じことをするための擬似コード

try:
    pass
except (Exception1, Exception2) as e:
    pass

複数の例外に対して一つの except ブロックを使って main ブロックを修正しましょう。

try:
    res = add_list(input_list_1)
    print(res)
except (TypeError, ValueError) as err:
    print(type(err), err)
 
try:
    res = add_list(input_list_2)
    print(res)
except (TypeError, ValueError) as err:
    print(type(err), err)

出力は同じになります。

<class 'TypeError'> can only concatenate str (not "int") to str
<class 'ValueError'> Integer Item has to be <= 200

注意: 複数の例外は、内蔵の例外とカスタムの例外の任意の組み合わせが可能です。

まとめ

今回は、Pythonで複数の例外を処理する方法として、複数の except ブロックを連続して使用する方法と、1つの except ブロックを使用してコードの重複を減らす方法の2つを学びました。

タイトルとURLをコピーしました