7–1. Pythonの例外処理 try-except


1. Pythonの例外とは?

コンピューターがソースコードによる命令を実行した際に起きる問題の総称を例外と言います。


例えば、10を0で割る計算や、存在しない変数にアクセスしたときに発生します。このようにソースコードに起因する問題以外にも、ネットワーク障害で通信不可になった場合や、メモリーの枯渇でシステムが動かなくなった場合などのケースも存在します。

また、このような事が起きることを想定してあらかじめ対処することを、例外処理と言います。


2. Pythonで例外が発生した場合の挙動

Pythonのプログラムを実行中に例外が発生すると、一般的にはPythonから例外オブジェクトと呼ばれるものが投げられます。

例外オブジェクトにはいくつかの種類、例外型があります。
例外型について、この記事では全てを取り扱いませんが、Pythonの公式ドキュメントに記載されているので、参考にしてください。
Python 組み込み例外

例外処理をしていない場合、例外オブジェクトが投げられると、プログラムの処理はそこで中断されます。
以下の例は、10を0で割って、ZeroDivisionErrorという例外型が投げられた時の挙動です。

10 / 0

>> Traceback (most recent call last):
>>    File "/Users/xxx/Documents/PythonSup/python_code/study_code.py", line 1, in 
>>      10 / 0
>>  ZeroDivisionError: division by zero
>>  Process finished with exit code 1

3. 基本的な例外処理の書き方

Pythonで例外オブジェクトが投げられても、プログラムの処理が中断しないようにするには、try – exceptを使います。

  • try節: try: の中に、例外が発生する可能性のある処理を書く。
  • except節: except の後に、例外型を書く。try節の処理で例外の型が一致している例外オブジェクトが投げられた時の処理をexcept節の中に書く。
  • もしも、例外型が一致していない、もしくは例外が投げられない場合は、何も処理されずにtry-exceptを抜けます。
try:
    例外が発生する可能性のある処理
except 例外型:
    例外が発生した場合の処理

例えば10を0で割った時の例外処理は以下のように書く事ができます。

try:
    10 / 0
except ZeroDivisionError:
    print('ゼロで割ることはできません。')

>> ゼロで割ることはできません。

4. 例外オブジェクトを変数に代入して使う

except の後に例外型を書いたら、as 変数名 を付け加えると、例外オブジェクトを変数に代入することができます。その変数を、except節の中でだけ使う事ができます。

try:
    例外が発生する可能性のある処理
except 例外型 as 変数名:
    例外が発生した場合の処理 (例外オブジェクトの変数を使える)

例えば、10を0で割るときに発生する例外オブジェクトを使ってエラーメッセージを表示させるコードは、以下のように書く事ができます。

try:
    10 / 0
except ZeroDivisionError as e:
    print(f'例外が発生しました。エラーメッセージ: {e}')

>> 例外が発生しました。エラーメッセージ: division by zero

5. 複数の例外型の例外処理

exceptで捕捉できる例外オブジェクトは、複数の例外型を設定することができます。except節を複数設定したばあい、その例外型に応じた例外処理を書く事ができます。

try:
    例外が発生する可能性のある処理
except 例外型①:
    例外型①の例外が発生した場合の処理
except 例外型②:
    例外型②の例外が発生した場合の処理
except 例外型③:
    例外型③の例外が発生した場合の処理

例えば、ZeroDivisionErrorと、NameError(未定義の変数にアクセスした)の両方の例外型の例外処理を記載するには、以下のように書きます。

try:
    10 / 1
    print(x)
except ZeroDivisionError as e:
    print(f'数値を0で割らないでください。エラーメッセージ: {e}')
except NameError as e:
    print(f'定義していない変数を使わないでください。エラーメッセージ: {e}')

>> 定義していない変数を使わないでください。エラーメッセージ: name 'x' is not defined

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

try節の中で、例外が発生しなかった時の処理を定義するにはelseを使います。

try:
    例外が発生する可能性のある処理
except 例外型:
    例外型の例外が発生した場合の処理
else:
    例外が発生しなかった場合の処理

7. try節が終了したら必ず実施する処理

例外の発生の有無に関わらず、try節の処理が終了したら、必ず実施したい処理を定義するには、finallyを使います。

try:
    例外が発生する可能性のある処理
except 例外型:
    例外型の例外が発生した場合の処理
finally:
    例外が発生の有無に関わらず必ず実行される処理

8. 例外の基底クラス

システム終了以外の全ての組み込み例外はExceptionから派生しています。
どういうことかとういうと、例外型をExceptionに指定してあげれば、try節で補足できる全ての例外オブジェクトに対する例外処理を定義することができます。

try:
    例外が発生する可能性のある処理
except Exception:
    システム終了以外の全ての例外が発生した場合の処理

自分で定義する例外クラスを作る場合もExceptionを基底クラスに指定しましょう。


9. Python 公式ドキュメント


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