Python

【Python 12】例外処理

環境

macOS Big Sur
Python3.8

構文エラーと例外

Pythonには「構文エラー(Syntax Error)」「例外(Exception)」の2種類のエラーがあります。

構文エラーとは、括弧やクォーテーションが無い、インデントができていないといった文法上のエラーです。これらは、プログラム実行前に判明するエラーです。

構文エラー以外のエラーは例外となります。「0で除算している」、「リストの要素数より大きいインデックスを指定して要素を取り出そうとしている」等、プログラムの実行時に判明するエラーです。

例外が発生すると「例外オブジェクト」が生成されます。例外オブジェクトもプログラム中で使用することができます。

また、例外が発生すると「トレースバック」というメッセージが表示されます。処理の履歴が表示され、最後に例外が発生した原因が表示されます。

# 「"」が不足しているため、「SyntaxError」が発生します。
>>> print('Hello)
  File "<stdin>", line 1
    print('Hello)
                ^
SyntaxError: EOL while scanning string literal


# 0で割算をすると、例外オブジェクト「ZeroDivisionError」が発生します。
>>> 1 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

 

例外処理

「try」「except」を使用することで、例外が発生した場合に特別な処理を実行するようなプログラムを作ることができます。

例外処理

try:
    例外が発生する可能性のある処理ブロック
except 例外オブジェクト:
    例外が発生した時点で実行される処理ブロック

※exceptの後に例外を指定しなければ、全ての例外を捕まえます。

※複数の例外を指定する場合は、「(例外オブジェクト1,例外オブジェクト2, …)」とします。

※exceptを複数使用することで、例外に応じて異なる処理を実行することができます。

※「except 例外オブジェクト as 変数名」とすることで、例外オブジェクトを受け取る変数を指定することができます。

# 特定の例外を捕まえる。
try:
    1 / 0
except ZeroDivisionError:
    print('Error')


# 実行結果
Error


# 複数の例外を捕まえる。
try:
    print(a)
except (NameError, ZeroDivisionError):
    print('Error')


# 実行結果
Error


# 例外を変数で受け取る。
try:
    1 / 0
except ZeroDivisionError as err:
    print(err)


# 実行結果
division by zero

 

else

例外が発生せず、try節の処理ブロックが正常終了した後に実行する処理を「else節」で指定できます。仮にtry節で例外が発生した場合は、else節は実行されません。

例外処理

try:
    例外が発生する可能性のある処理ブロック
except 例外オブジェクト:
    例外が発生した時点で実行される処理ブロック
else:
    try節が正常終了した後に実行される処理ブロック

# try節が正常終了。
try:
    1 / 1
except ZeroDivisionError:
    print('Error')
else:
    print('No Error')


# 実行結果
No Error


# tryで例外発生。
try:
    1 / 0
except ZeroDivisionError:
    print('Error')
else:
    print('No Error')


# 実行結果
Error

finally節

例外が発生してもしなくても、必ず最後に実行する処理を「finally節」で指定できます。

# 正常終了
try:
    1 / 1
except ZeroDivisionError:
    print('Error')
else:
    print('No Error')
finally:
    print('Finish')


# 実行結果
No Error
Finish


# 例外発生
try:
    1 / 0
except ZeroDivisionError:
    print('Error')
else:
    print('No Error')
finally:
    print('Finish')


# 実行結果
Error
Finish

 

例外を発生させる

「raise文」を使用することで、例外が発生したことを知らせることができます。

raise文

raise 例外オブジェクト名('メッセージ')

raise ZeroDivisionError('0で割っています。')


# 実行結果
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-19-9c343b9cd080> in <module>
----> 1 raise ZeroDivisionError('0で割っています。')

ZeroDivisionError: 0で割っています。