はじめに
Pythonの例外処理(try-except)について,簡単に紹介します.
基本構文
Pythonの例外処理の基本として,try-exceptがあります.
例として,ゼロ除算実行時に発生するZeroDivisionError
のケースについて説明します.
ゼロ除算を実行すると以下のようなエラーが発生します.
print(1 / 0)
# ZeroDivisionError: division by zero
この例外を捕捉するには次のように記述します.
try:
print(1 / 0)
except ZeroDivisionError:
print('Error')
# Error
"except 例外名"
はtry
節内で例外名のエラーが発生した場合,try
節のコードを中断しexcept
節内のコードを実行します.
さらに,except 例外名 as 変数名
とすると,変数に例外オブジェクトを格納して使用できます.例外オブジェクトはエラーメッセージなどが格納されており,エラーの内容を確認できます.
try:
print(1 / 0)
except ZeroDivisionError as e:
print(e)
print(type(e))
# division by zero
# <class 'ZeroDivisionError'>
基底クラスを指定しても捕捉することができます.例えば,ZeroDivisionError
の基底クラスはArithmeticError
.変数には実際に発生した派生クラスの例外オブジェクトが格納されます.
try:
print(1 / 0)
except ArithmeticError as e:
print(e)
print(type(e))
# division by zero
# <class 'ZeroDivisionError'>
複数の例外に異なる処理を実行
複数の例外を捕捉し,それぞれ異なる処理を行いたい場合は,except
を例外ごとに設定します.
def divide(a, b):
try:
print(a / b)
except ZeroDivisionError as e:
print('catch ZeroDivisionError:', e)
except TypeError as e:
print('catch TypeError:', e)
divide(1, 0)
# catch ZeroDivisionError: division by zero
divide('a', 'b')
# catch TypeError: unsupported operand type(s) for /: 'str' and 'str'
複数の例外に同じ処理を実行
タプルで例外名を指定することで,1つのexcept
節で複数の例外を捕捉することができます.
def divide(a, b):
try:
print(a / b)
except (ZeroDivisionError, TypeError) as e:
print(e)
divide(1, 0)
# division by zero
divide('a', 'b')
# unsupported operand type(s) for /: 'str' and 'str'
すべての例外を捕捉し,同じ処理を実行
全ての例外を捕捉したい場合は,例外名を指定せずに記述します.
try:
print(1 / 0)
except:
print('Error')
# Error
複数のexcept
がある場合は,最後のexcept
節のみ例外名を省略できます.(if
文で言うelif
と'''else'''みたいな)
正常終了時の処理 : else
try
節で例外が発生せず終了したあとに行う処理を,else
節に指定できます.
def divide(a, b):
try:
print(a / b)
except ZeroDivisionError as e:
print('catch ZeroDivisionError:', e)
else:
print('finish (no error)')
divide(1, 2)
# 0.5
# finish (no error)
divide(1, 0)
# catch ZeroDivisionError: division by zero
終了時に常に行う処理 : finally
例外の発生によらず,必ず最後に行う処理をfinally
節に指定できます.
def divide(a, b):
try:
print(a / b)
except ZeroDivisionError as e:
print('catch ZeroDivisionError:', e)
finally:
print('all finish')
divide(1, 2)
# 0.5
# all finish
divide(1, 0)
# catch ZeroDivisionError: division by zero
# all finish
まとめ
-
except 例外名
: 特定の例外を捕捉 -
except 例外名 as 変数名
: 変数に例外オブジェクトを格納 -
except
は複数設定可 -
except
に例外名を指定しない場合,すべての例外を捕捉
try:
print(1 / 0)
except: # tryで例外が発生した場合
print('Error')
else: # tryで例外が発生しなかった場合
print('finish (no error)')
finally: # 例外の発生に関わらず必ず実行
print('all finish')