【python】例外処理について try-except

2020年5月17日

0除算や型間違いなどエラーを発生させるとプログラムは停止してしまいます。
この時、プログラムを止めずに次の処理を行うために例外処理があります。

処理実行中に想定外のエラーが発生した時にプログラムを止めたくない。
特定のエラーの時にだけしたい処理があるなどの時に例外処理を行います。

下記は基本的な形になります。
tryの中に処理を記載してその中でエラーが発生するとtry内の処理を中断して、except内の処理が実行されます。

try: #エラーが発生するかもしれない処理
    【処理1】
    【処理2】
     ・・・
    【処理n】
except: #tryの中でエラーが発生後に飛ぶ場所
    【処理1】
    【処理2】
     ・・・
    【処理n】

エラー発生時にキャッチする

下記は0除算を行ったときに例外処理を行うプログラムです。

try:
    num = 10/0
    print("エラーが発生するのでここは実行できません")
except:
    print("エラーが発生しました") #エラーが発生しました

2行目:0除算を行うのでエラーが発生します。(この時点で5行目に移動します)
3行目:このprint関数は実行されません
5行目:2行目を実行してエラーが発生した時点でここに飛びます。

エラーが発生した時にエラー内容を知る(万能)

traceback.print_exc()はexcept内で実行するとエラー内容を知ることができます。
取り合えずエラー内容を知りたいとき、デバッグ時は便利なので使用していきましょう。

try:
    num = 10/0
except:
    import traceback
    traceback.print_exc()  #Traceback (most recent call last):
                           #  File "Exception.py", line 12, in sample2
                           #    num = 10/0
                           #ZeroDivisionError: division by zero

2行目: 0除算でエラーを発生(3行目に移動)
4行目:tracebackをインポート
5行目:エラー発生の行数やエラー内容表示

特定のエラーでのみ例外処理を行う(ValueError:型間違い)

下記は文字列をint型にキャストした時(ValueError)だけの例外処理を行います。

try:
    num = int( "a" )
except ValueError:
    print("エラー内容:ValueError") #エラー内容:ValueError
except:
    print("エラーが発生しました")

2行目:文字列をint型にキャストしてエラー発生(3行目に飛ぶ)
3行目:ValueError(型間違いに関するエラー)の時の未実行されます。
5行目:通常のexceptは実行されません。

特定のエラーでのみ例外処理を行う(0除算によるエラー)

0除算時のエラー(ZeroDivisionError)で例外処理を行ってみましょう。

try:
    num = 10/0
except ValueError:
    print("エラーが発生しました:ValueError")
except ZeroDivisionError:
    print("エラーが発生しました:ZeroDivisionError") #エラー内容:ValueError
except:
    print("エラーが発生しました")

2行目:0除算でエラー(ZeroDivisionError)発生 5行目に飛ぶ
3-4行目:ValueErrorは発生していないため実行されない
5行目: 0除算発生 (ZeroDivisionError) している為、実行
6行目:エラー表示
7-8行目:実行されない

エラーの内容を表示する

特定のエラーのみをexceptでキャッチした時はasでエラー内容のオブジェクトを取得することができます。

try:
    num = 3/0
except ValueError as err:
    print("エラーが発生しました:ValueError")
    print( err )
except ZeroDivisionError as err:
    print("エラーが発生しました:ZeroDivisionError")  #エラーが発生しました:ZeroDivisionError
    print( err )                                    #division by zero
except:
    print("エラーが発生しました")

2行目:0除算でエラーを発生(6行目に移動)
6行目:エラー内容を変数「err」にセット
8行目:エラー内容表示(division by zero)

ソースコードはこちらから

このページで紹介している記事のソースコードの販売を行っています。
python基本を押さえたソースコードを収録しています。
購入頂いたソースコードは商用利用OKになります。

ソースコードの販売はこちら