Pythonにおける例外処理の実装方法を解説します。
プログラミング初心者の方向けに、そもそも例外処理って何?というところから、例外処理の実装方法(try except else finally)について端的に解説します。
1つの機能を1から実装していく上で避けて通れないのが例外処理の理解です。
是非最後までご覧いただき、この機会にPythonの例外処理をマスターしておきましょう。
例外処理とは?
そもそも例外処理とは何か?
プログラミングの世界で発生するエラーは大きく2つに分類されます。1つが、構文エラー(syntax error)。もう1つが、例外(exception)です。
構文エラー(syntax error)
構文エラーは、その名の通り構文(Pythonの記述)にエラーがある場合に生じるエラーです。
print("Hello World" # print関数の閉じ括弧が抜けています。 # 結果 ⇒ SyntaxError: unexpected EOF while parsing
この例では、単純に括弧が抜けているために構文エラーが発生しています。
恐らく、Pythonエンジニアを目指す人の中で最も頻繁に遭遇するエラーです。
例外(exception)
例外(exception)は、プログラムの実行中に発生するエラーです。
構文は正しくても、何かしら処理しきれないようなロジックを組んだ場合などに発生します。
代表的なものが「0で割る」場合に起きる「ZeroDivisionError」です。
def calc(a,b): return a / b calc(5,0) # 5÷0 を実施 # 結果 ⇒ ZeroDivisionError: division by zero
例外(exception)は、以下のような場合に発生します。
① type error(データ型が適切でない場合に発生します。)
a = "あなたは" b = 25 c = "歳です。" print(a + b + c) # 結果 ⇒ TypeError: can only concatenate str (not "int") to str
② Name Error(名前が間違っている場合に発生します。)
abc = "Hello World!" print(abcd) # 結果 ⇒ NameError: name 'abcd' is not defined
このようにエラーが発生した場合、例外処理を実装しないとプログラムは動かなくなってしまいます。
逆に言うと、例外処理を適切に実装できれば、障害に強いプログラミングが可能になります。
ここから、Pythonにおける例外処理の実装方法を確認していきましょう。
例外処理の基本(try-except)
例外処理は、「もし例外が発生したら、〇〇する。」というように、あらかじめ例外が発生する可能性に備えてコーディングしておくことを指し示します。
Pythonでは、try文を用いて例外処理を実装します。
try: # 例外が発生しうる処理 except (例外): # 例外発生時の処理
例外処理を行いたい処理をtryで括り、例外が発生した場合の処理をexceptで記述します。
構文自体は、非常に簡易的です。サンプルコード(ZeroDivisionError)を見て、例外処理のイメージをつかみましょう。
try: a = 5 / 0 # 5÷0は例外が発生します except ZeroDivisionError : print("ZeroDivisionErrorが発生しました。") # 例外が発生した場合の処理 # 結果 ⇒ ZeroDivisionErrorが発生しました。
例外「ZeroDivisionError」が発生した場合にのみ、メッセージを表示する処理を実装しています。
もし、例外が「 ZeroDivisionError 」ではない場合。
try: a = 'abc' b = 123 c = a + b # 例外「TypeError」 except ZeroDivisionError : print("ZeroDivisionErrorが発生しました。") # 例外が発生した場合の処理 # 結果 ⇒ メッセージは表示されません。 # ※TypeError: can only concatenate str (not "int") to str
この場合は、メッセージは表示されません。exceptで指定した処理は、あくまでも「ZeroDivisionError」が発生した場合にのみ行われる処理であるためです。
try: a = 'abc' b = 123 c = a + b # 例外「TypeError」 except TypeError : print("TypeErrorが発生しました。") # 例外が発生した場合の処理 # 結果 ⇒ TypeErrorが発生しました。
もし、指定した例外だけではなく、全ての例外の場合に共通処理を行いたい場合は、例外を指定しないやり方があります。
try: a = 'abc' b = 123 c = a + b except: print("例外が発生しました。") # 例外が発生した場合の処理 # 結果 ⇒ 例外が発生しました。
複数の例外を補足する場合
exceptは複数記述することができます。
try: a = 'abc' b = 123 c = a + b # 例外「TypeError」 d = 5 / 0 # 例外「ZeroDivisionError」 except TypeError: print("TypeErrorが発生しました。") except: print("ZeroDivisionErrorが発生しました")
ただし、複数記述した場合も、処理が行われるのは1つだけ。
最初に発生した例外のみを補足します。
つまり、以下の場合は「TypeErrorが発生しました。」と表示。
try: a = 'abc' b = 123 c = a + b # 例外「TypeError」 d = 5 / 0 # 例外「ZeroDivisionError」 except TypeError: print("TypeErrorが発生しました。") except: print("ZeroDivisionErrorが発生しました")
この場合は「ZeroDivisionErrorが発生しました」と表示されます。
try: a = 'abc' b = 123 d = 5 / 0 # 例外「ZeroDivisionError」 c = a + b # 例外「TypeError」 except TypeError: print("TypeErrorが発生しました。") except: print("ZeroDivisionErrorが発生しました")
例外処理の応用(else/finally)
elseで、例外が発生しなかった場合の処理を。
finallyで、例外の発生に関係なく必ず最後に実行する処理を定義することができます。
try: # 例外が発生しうる処理 except (例外): # 例外発生時の処理 else: # 例外が発生しなかった場合の処理 finally: # 最後に必ず実行される処理
サンプルコードを確認しながらそれぞれの動きを見てみましょう。
else:例外が発生しなかった場合
elseは例外は発生しなかった場合の処理です。
try: a = 20 / 2 print(a) except ZeroDivisionError: print("ZeroDivisionErrorが発生しました。") else: print("例外処理は発生していません。") """ 結果 10.0 例外処理は発生していません。 """
print関数の結果に加えて、「例外処理は発生していません。」という内容が表示されていることが分かります。
finally:例外の発生有無にかかわらず最後に実行される処理
finallyで、例外の発生に関係なく必ず最後に実行する処理を定義することができます。
try: a = 20 / 0 print(a) except ZeroDivisionError: print("ZeroDivisionErrorが発生しました。") else: print("例外処理は発生していません。") finally: print("最後にこの文章が必ず表示されます。") """ 結果 ZeroDivisionErrorが発生しました。 最後にこの文章が必ず表示されます。 """
もちろん、例外が発生しなくても、最後の文章は必ず表示されます。
try: a = 20 / 2 print(a) except ZeroDivisionError: print("ZeroDivisionErrorが発生しました。") else: print("例外処理は発生していません。") finally: print("最後にこの文章が必ず表示されます。") """ 結果 10.0 例外処理は発生していません。 最後にこの文章が必ず表示されます。 """
Pythonを1から学習したい方は
Pythonをより実践的に学びたい―。実際にコーディングをしながら学びたい―。独学に限界を感じている―。
そんな方には、無料体験/オンライン完結もあるプログラミングスクールで学ぶのがおすすめです。都度検索しながら知識を補完していくのではなく、1から体系立てて学ぶことで短時間・かつ効率的にスキルハックすることが可能です。
各プログラミングスクールの特徴をまとめた記事をこちらに記載しておきますので、是非ご覧ください。