Pythonの例外処理(try-except)について解説します!
そもそも例外とは・・
例外(Exception)は、プログラムの実行中に発生する予期しないエラーのことです。
例えば、ゼロを除算(割り算)するコードがあったとします。
x = 10 / 0
print(x)
このコードを実行すると、
ZeroDivisionError: division by zero
の例外エラー(ゼロは除算できない)が発生します。
このように例外エラーが発生すると、その時点で処理が終了してしまいます。
try-except文の基本構文
Pythonでは例外処理を行うために、try-except文を使うことが多いです。
try-except文の基本構文は次の通りです。
try:
# エラーが発生する可能性のある処理
except エラーの種類:
# 例外が発生したときの処理
では、実際に先ほどのゼロ除算で発生する例外エラーの処理を書いてみましょう。
try:
x = 10 / 0
except ZeroDivisionError:
print("ゼロで除算することはできません。")
上記のコードを実行すると、先ほどのように「ZeroDivisionError」の例外エラーメッセージではなく、「ゼロで除算することはできません。」という、実装者側が意図したエラーメッセージを返却することができます。
複数の例外を処理する
1つのtryブロック内に、複数の異なる例外を処理することもできます。
例えば、下記のようなコードがあるとします。
try:
# エラーが発生する可能性のある処理
except ZeroDivisionError:
print("ゼロで除算することはできません。")
except FileNotFoundError:
print("ファイルが見つかりませんでした。")
except Exception as e:
print(f"予期しないエラーが発生しました: {e}")
この処理では、「ZeroDivisionError」と「FileNotFoundError」の例外エラーが想定されるため、個別に例外をキャッチするよう処理を記載しています。
加えて、「Exception」クラスは、すべての例外の親クラスであることを利用して、「ZeroDivisionError」と「FileNotFoundError」以外の例外エラーが発生した場合は、すべてException内の処理が実行されるよう記載しています。
また「Exception as e」と記載することで、例外オブジェクトを変数eに代入し、詳細なエラーメッセージを取得できます。
例えば、変数xをprintしようとして、誤って存在しない変数yをセットしているコードを実行してみます。
try:
x = 10 / 2
print(y)
except ZeroDivisionError:
print("ゼロで除算することはできません。")
except FileNotFoundError:
print("ファイルが見つかりませんでした。")
except Exception as e:
print(f"予期しないエラーが発生しました: {e}")
実行結果は、
予期しないエラーが発生しました: name 'y' is not defined
となり、Exceptionクラス内のエラーメッセージが返却されていることがわかります。
elseとfinallyについて
例外が発生しなかった場合に行う処理を明記する場合は「else」、例外の発生に関わらず必ず処理を行う場合は「finally」を使用します。
else
下記の例では、10 / 2の計算は例外エラーなく行われるため、else内のメッセージが表示されます。
try:
x = 10 / 2
except ZeroDivisionError:
print("ゼロで除算することはできません。")
else:
print("計算は成功しました。結果は:", x)
finally
finallyは、例外の発生有無に関わらず必ず実行されるため、リソースの解放など、必ず行うべき処理をここに書きます。
try:
x = 10 / 2
except ZeroDivisionError:
print("ゼロで除算することはできません。")
finally:
print("処理が完了しました。")
この例では、必ず「処理が完了しました。」のメッセージが返却されます。
raiseについて
最後に明示的に例外を発生されることができる「raise」について解説します。
例えば、負の値が渡された際に、例外エラーを発生させたい場合、下記のようなコードで実現することができます。
def check_value(value):
if value < 0:
raise ValueError("負の値は許可されていません。")
return value
try:
result = check_value(-1)
except ValueError as e:
print(e)
この例では、-1という負の値が渡され、raise内のValueErrorが実行され、「負の値は許可されていません。」のエラーメッセージが返却されます。
最後に・・
例外処理を正しく行うことで、ユーザーにとって使いやすく、開発者にとってデバッグしやすいコードに近づきます。
初心者の方には少し取っ掛かりづらいところではありますが、必ず必要になる処理になりますので、ぜひマスターしていきましょう。