Python - 例外処理
基本的な例外処理: try, except
Python では例外が発生した場合、try と except を使って処理をすることができます。例えば、ゼロによる除算が行われると ZeroDivisionError 例外が発生しますが、以下の例ではその例外をエラー出力として処理しています。
try:print(1 / 0)except ZeroDivisionError:print('Error')# Error
また except 例外型 as 変数名: とすることで、変数に例外オブジェクトを格納して使用することができます。
try:print(1 / 0)except ZeroDivisionError as e:print(e)# division by zero
try 部分で例外が発生すると、それ以降の処理はスキップされます。以下の例のように for 文の途中で例外が発生すると、その時点で for 文は終了して except の処理に移行する。正常終了時の処理や、終了時に必ず行う処理などは後述する else や finally で指定します。
try:for i in [-2, -1, 0, 1, 2]:print(1 / i)except ZeroDivisionError as e:print(e)# -0.5# -1.0# division by zero
複数の例外処理: try, except
上記の例では ZeroDivisionError 例外は処理できますが、それ以外の例外は処理できずに途中終了します。複数の例外処理を行う場合は、except を複数指定します。except を複数指定することで、複数の例外に対してそれぞれ異なる処理を記述することができます。
def divide_each(a, b):try:print(a / b)except ZeroDivisionError as e:print('catch ZeroDivisionError:', e)except TypeError as e:print('catch TypeError:', e)divide_each(1, 0)# catch ZeroDivisionError: division by zerodivide_each('a', 'b')# catch TypeError: unsupported operand type(s) for /: 'str' and 'str'
複数の例外に対して同じ処理を実行するには、except に複数の例外型をタプルで指定します。
def divide_same(a, b):try:print(a / b)except (ZeroDivisionError, TypeError) as e:print(e)divide_same(1, 0)# division by zerodivide_same('a', 'b')# unsupported operand type(s) for /: 'str' and 'str'
すべての例外に対して処理を行う場合は、except から例外型を省略します。ただし、複数の except がある場合、例外型を省略できるのは最後の except のみになります。
def divide_wildcard(a, b):try:print(a / b)except:print('Error')divide_wildcard(1, 0)# Errordivide_wildcard('a', 'b')# Error
システム終了以外のすべての組み込み例外の基底クラスである Exception を指定する方法もあります。
def divide_exception(a, b):try:print(a / b)except Exception as e:print(e)divide_exception(1, 0)# division by zerodivide_exception('a', 'b')# unsupported operand type(s) for /: 'str' and 'str'
正常終了時の処理: else
try で例外が発生せず正常終了した後に行う処理を else に指定できます。例外が発生して except に処理が移行した場合は else の処理は実行されません。
def divide_else(a, b):try:print(a / b)except ZeroDivisionError as e:print('catch ZeroDivisionError:', e)else:print('finish (no error)')divide_else(1, 2)# 0.5# finish (no error)divide_else(1, 0)# catch ZeroDivisionError: division by zero
終了時に必ず行う処理: finally
try で例外が発生したかどうかに関わらず、必ず最後に行う処理を finally に指定できます
def divide_finally(a, b):try:print(a / b)except ZeroDivisionError as e:print('catch ZeroDivisionError:', e)finally:print('finish')divide_finally(1, 2)# 0.5# finishdivide_finally(1, 0)# catch ZeroDivisionError: division by zero# finish
else と finally を同時に使うこともできます。正常終了時は else の処理が実行されたあとに finally の処理が実行されます。
def divide_else_finally(a, b):try:print(a / b)except ZeroDivisionError as e:print('catch ZeroDivisionError:', e)else:print('finish (no error)')finally:print('finish')divide_else_finally(1, 2)# 0.5# finish (no error)# finishdivide_else_finally(1, 0)# catch ZeroDivisionError: division by zero# finish
例外を無視: pass
try で例外が発生しても無視する場合は pass 文を使用します。
def divide_pass(a, b):try:print(a / b)except ZeroDivisionError:passdivide_pass(1, 0)