プログラム実行中に考慮しなくてはいけないことの1つに、エラーや例外の処理があります。
大抵のプログラム言語には、これを行うための専用の構文が存在しています。例えば、Javaの言語でいう「try-catch文」です。
今回は、そんな例外処理を行うためのpython基本形でもあるtry-exceptの派生形について、まとめます。
例外処理
Pythonの例外処理の基本形である「try」「except」 を使用した構文を理解している方向けです。
こちらについて分からない場合は、まず前編をご覧ください。
例外が発生しなかった時に実行される処理
基本形にelse文を追加した構文です。
else文は、try文の中で例外が発生しなかった時に実行される処理になります。
処理のフローを以下に記載します。
実際のソースコードで一例を示します。
コードサンプル:
try:
print(“Try Process is in progress.”)
except:
print(“Exception is occurred.”)
else:
print(“Try Process was successful.”)
実行結果:
Try Process is in progress.
Try Process was successful.
例外発生有無に限らず必ず実行される処理
基本形にfinally文を追加した構文です。
finally文は、例外の発生する/しないに関わらず、tryによる例外処理を記載したら必ず実行される処理です。
処理のフローを以下に記載します。
実際のソースコードで一例を示します。
コードサンプル:
def TEF_sample(a, b):
try:
print(a / b)
except:
print(“Exception is occured.”)
finally:
print(“Process is finished.”)
TEF_sample(1, 2) #例外が発生しない場合
print(” “)
TEF_sample(1, 0) #例外が発生する場合
実行結果:
0.5
Process is finished.Exception is occured.
Process is finished.
また、初めに「finally文は、tryによる例外処理を記載したら必ず実行される処理」と記載しました。
これはexcept文内に、return文/break文を記載した時でも必ず実行されるということです。
以下で例示します。
コードサンプル(return文):
def sample():
try:
no_code()
except:
print(“error is occured.”)
return (f”except for body: {e2}”)
finally:
print(“finally is finished.”)
a = sample()
print(a)
実行結果(return文):
error is occured.
finally is finished.
except for body: name ‘no_code’ is not defined
コードサンプル(break文):
while True:
try:
no_code()
except:
print(“error is occured.”)
break
finally:
print(“finally is finished.”)
実行結果(break文):
error is occured.
finally is finished.
このように、finally文は必ず通り、最後にexcept文内のreturn文が実行されます。
順番としては、try文(例外が発生) ⇒ except文 ⇒ finally文 ⇒ except文(return文)となります。
もちろん、上記ソースコードでfinally文にreturnがあった場合は、except文内のreturn文は実行されずにfinally文内で値が返されます。
しかし、finally文内でreturn文/break文で返す場合は、例外の情報は破棄されるようなので、注意が必要です。
こういった現象を避けるには、
try / except / finaly の中に記載するのではなく、finally文の後に記載すると良いでしょう。以下では、break文に対して例示しますが、return文の場合も同様です。
コードサンプル(break文の場合):
while True:
try:
no_code()
except:
print(“error is occured.”)
finally:
print(“finally is finished.”)
break
全部乗せ
先述の else /finally は同時に使うことも、もちろん可能です。それぞれの動きや役割は同じです。
処理のフローを以下に記載します。
実際のソースコードで一例を示します。
コードサンプル:
def TEF_sample(a, b):
try:
print(a / b)
except:
print(“Exception is occured.”)
else:
print(“Try Process was successful.”)
finally:
print(“Process is finished.”)
TEF_sample(1, 2) #例外が発生しない場合
print(” “)
TEF_sample(1, 0) #例外が発生する場合
実行結果:
0.5
Try Process was successful.
Process is finished.
Exception is occured.
Process is finished.
まとめ
今回は、pythonにおける例外処理の中編として基本形でもあるtry-exceptの派生形について記載しました。
後編では、pythonの例外処理における補足情報をまとめます。
こちらも、参考にしてみて下さい。