Python

【Python】try文を使った例外処理の仕方を解説

この記事では、Pythonで例外処理する方法を解説します。

例外処理とは、エラーに応じて実行される処理のことを言います。
また、「エラー処理」とも呼ばれたりします。

エラー(例外)が発生するとその時点でプログラムは中断されてしまう。エラーが発生したけどプログラムを中断したくない場合は、あらかじめ例外処理を定義しておくことでプログラムを中断することなく発生したエラーに応じた処理を実行させることができます。

それでは、例外処理の仕方を見ていきましょう!

例外処理の基本

Pythonで例外処理をするには、try文とexcept節を使って定義します。try文ブロック内でエラーが発生した場合はexcept節が処理されます。

try:
    # なんらかの処理
except:
    # tryブロック内でエラーが発生した場合の処理

サンプル

try文ブロック内であえてエラーを発生させ、エラー処理を行っています。

value = 'one'

try:
    # int に変換できないのでエラー発生
    value = int(value)
except:
    # try文でエラーが発生すると実行される
    print('valueはintに変換できません')

実行結果

valueはintに変換できません

try文を使って例外処理できました。

後処理(finally)

try文のオプションとしてfinally節を定義できます。finally節は、例外処理の最後に実行されます。try文ブロック内でエラーが発生してもしなくても必ず実行されます。

try:
    # なんらかの処理
except:
    # tryブロック内でエラーが発生した場合の処理
finally:
    # 最後に必ず処理される

サンプル

先ほどのサンプルコードにfinallyを追加して実行してみます。

value = 'one'

try:
    value = int(value)
except:
    print('valueはintに変換できません')
finally:
    print('例外処理 終了')

実行結果

valueはintに変換できません
例外処理 終了

発生したエラーで処理を分岐させる

try文内で発生したエラーの型によって処理を分岐させることができます。エラーによって処理を分岐するには分岐させたいエラーの型を指定したexcept節を定義します。

value = 'one'

try:
    value = int(value)
except ValueError:           # ValueErrorが発生した時に処理される
    print('ValueErrorが発生')
except:                      # ValueError以外が発生した時に処理される
    print('その他エラーが発生')

実行結果

ValueErrorが発生

分岐はいくつでも定義することができますが、

num = 'one'

try:
    int(num)
except EOFError:
    print('EOFErrorが発生')
except SyntaxError:
    print('SyntaxErrorが発生')
except ValueError:
    print('ValueErrorが発生')

実行結果

ValueErrorが発生

発生したエラーに対応する分岐先が存在しなければエラーがそのまま発生してしまう。

num = 'one'

try:
    int(num)
except SyntaxError:
    print('SyntaxErrorが発生')

実行結果

Traceback (most recent call last):
  File "main.py", line 4, in 
    int(num)
ValueError: invalid literal for int() with base 10: 'one'

エラーメッセージを受け取る

except節にasを使うことでエラーが発生して生成されたインスタンスからエラーメッセージを受け取ることができます。

num = 'one'

try:
    int(num)
except ValueError as e:
    print(f'type: {type(e)}')
    print(f'エラーメッセージ: {e}')

実行結果

type: <class 'ValueError'>
エラーメッセージ: invalid literal for int() with base 10: 'one'

asの使う場面と使い方について

エラーを発生させる

raise文を使うことでエラーを自発的に発生させることができます。

def func(num: int):
    if num == 0:
        # エラーを発生させる
        raise

try:
    func(0)
except:
    print('func関数でエラー発生')

実行結果

func関数でエラー発生

raise文にエラーの型を指定することで発生させるエラーの種類を指定できます。また、引数に文字列を指定することでエラーメッセージを指定できます。

def func(num: int):
    if num == 0:
        raise ValueError('エラーが発生!')

try:
    func(0)
except ValueError as e:
    print(e)

実行結果

エラーが発生!

関数内に例外処理を実装してしまうと処理が固定化されてしまい柔軟性に欠ける。なので、呼び出し元に例外処理をさせるために使います。

まとめ

この記事では、Pythonの例外処理について解説しました。

おさらい

もし、理解できない箇所があったら記事を読み返してみましょう!

def func():
    raise ValueError('ValueErrorが発生しました!')

try:
    func()
except ValueError as e:
    print(e)
except:
    print('その他のエラー')
finally:
    print('例外処理終了!')

実行結果

ValueErrorが発生しました!
例外処理終了!

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ