例外処理

入門Python3 4.11


例外処理の話です。C#にもありましたね

以下の処理は例外が発生します。

ary = []
print(ary[0])
$ py main.py
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(ary[0])
IndexError: list index out of range


これをtry,exceptを使うことで全ての例外をキャッチすることができます。

try:
    ary = []
    print(ary[0])
except:
    print("error")
$ py main.py
error


この時、例外の内容を取りたい場合は以下のようにします。

try:
    ary = []
    print(ary[0])
except Exception as e:
    print("error:",e)
$ py main.py
error: list index out of range


個別に例外をキャッチすることもできます。例えばIndexErrorをキャッチしたい場合は以下のように書きます。

try:
    ary = []
    print(ary[0])
except IndexError as e:
    print("error",)
$ py main.py
error: list index out of range


exceptは複数行に渡って書くこともできます。

try:
    ary = []
    print(ary[0])
except IndexError as e:
    print("error1:",e)
except KeyError as e:
    print("error2:",e)
$ py main.py
error1: list index out of range
try:
    ary = {}
    print(ary[0])
except IndexError as e:
    print("error1:",e)
except KeyError as e:
    print("error2:",e)
$ py main.py
error2: 0


また一つのexceptに複数の例外を書くこともできます。

try:
    ary = []
    print(ary[0])
except (IndexError,KeyError) as e:
    print("error:",e)
$ py main.py
error: list index out of range


finallyを使うことで、例外が発生したかしないかに限らずに常に呼ばれる処理を書くことができます。

try:
    ary = []
    print(ary[0])
except IndexError as e:
    print("error:",e)
finally:
    print("finally")
$ py main.py
error: list index out of range
finally


elseを使うことで、例外が呼ばれなかった場合、つまり正常に処理が終えた場合の時に呼ばれる処理を書くことができます。

try:
    ary = []
    # 正常終了
except IndexError as e:
    print("error:",e)
else:
    print("正常終了")
$ py main.py
正常終了
try:
    ary = []
    print(ary[0]) # 例外発生
except IndexError as e:
    print("error:",e)
else:
    print("正常終了")
$ py main.py
error: list index out of range


自分で例外を投げるにはraiseを使います

try:
    raise IndexError("例外テスト")
except IndexError as e:
    print("error:",e)
$ py main.py
error: 例外テスト