Python 例外処理

例外処理の書き方を説明します。


基本の書き方

tryの中の処理で例外が発生したとき、投げられた例外オブジェクトが except の後に記載したクラスと同じか派生クラスの場合、exceptの中の処理を実施する。

try:
    処理
except 例外クラス:
    例外クラスの例外が発生した時の処理

 

try:
    num = 1011
    num.startswith('3')
    print('3から始まるかの判別が完了しました。')
except AttributeError:
    print('AttributeErrorが発生しました。')

>> AttributeErrorが発生しました。

例外オブジェクトを変数に格納

exceptの最後にasをつけることで、投げられた例外オブジェクトを格納して、exceptの中で使用することができる

try:
    処理
except 例外クラス as 変数:
    例外クラスの例外が発生した時の処理

 

try:
    num = 1011
    num.startswith('3')
    print('3から始まるかの判別が完了しました。')
except AttributeError as e:
    print(e, type(e))

>> 'int' object has no attribute 'startswith' <class 'AttributeError'>

エラーの種類で分岐

exceptは例外クラスごとに、分岐させて例外処理を書くことができる。

try:
    処理
except 例外クラス①:
    例外クラス①の例外が発生した時の処理
except 例外クラス②:
    例外クラス②の例外が発生した時の処理

 

try:
    num_x = '100' 
    num_y = '200'
    sum([num_x, num_y])
except AttributeError as e:
    print(type(e), e)
except TypeError as e:
    print(type(e), e)

>> <class 'TypeError'> unsupported operand type(s) for +: 'int' and 'str'

例外が発生しなかった時の処理

例外が発生せず、exceptで引っかからなかった時の処理はelseの後に記載する。

try:
    処理
except 例外クラス:
    例外クラスの例外が発生した時の処理
else:
    例外が発生しなかった時の処理

 

try:
    num_x = 100
    num_y = 200
    sum([num_x, num_y])
except TypeError as e:
    print(type(e), e)
else:
    print('正常終了しました。')

>> 正常終了しました。

例外の発生有無に関わらず実行する処理

例外が発生しても発生しなくても、同じ処理をしたい場合にfinallyを使います。

try:
    処理
except 例外クラス:
    例外クラスの例外が発生した時の処理
finally:
    どんな時も実行される処理

 

try:
    num_x = '100'
    num_y = '200'
    sum([num_x, num_y])
except TypeError as e:
    print('例外が発生しました。')
    print(type(e), e)
finally:
    print('処理が終了しました。')

>> 例外が発生しました。
>> <class 'TypeError'> unsupported operand type(s) for +: 'int' and 'str'
>> 処理が終了しました。

例外の基底クラス

システム終了以外の全ての組み込み例外はExceptionから派生しています。自分で定義する例外クラスを作る場合もExceptionを基底クラスに指定しましょう。

そのため、システム終了以外の全ての例外が発生した場合の例外処理を書きたい場合、except Exception: を使います。

try:
    処理
except AttributeError:
    AttributeErrorの例外が発生した時の処理
except Exception:
    システム終了・AttributeError以外の例外が発生した時の処理

 

try:
    num_x = '100'
    num_y = '200'
    sum([num_x, num_y])
except AttributeError as e:
    print('AttributeError例外が発生しました。')
    print(e)
except Exception as e:
    print('例外が発生しました。')
    print(type(e), e)

>> 例外が発生しました。
>> <class 'TypeError'> unsupported operand type(s) for +: 'int' and 'str'

このエントリーをはてなブックマークに追加

関連記事