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つを学びました。