プログラムを作成しているとバグという問題が発生することがあります。
これは長いプログラムになるほど発生する確率が上がり、なかなか避けられるものではありません。
ただ、バグというのは徐々に減らし、最終的にはゼロにすることが可能です。
だからと言って、それでプログラムに何の問題も無くなるわけではありません。
プログラムにはプログラマが避けることが不可能な問題があります。
それが例外です。
例外とは
例えば、あるプログラムからデータベースに対して情報を保存する処理を作ったとしましょう。
バグがなければ正常に動作するはずですが、プログラマ側では解決できない問題もあります。
・データベースが無かった
・データベースが止まっていた
・ディスクが一杯だった
・それ以外の予測できない問題
このようにプログラムを作った段階では動作に問題がなくても、実際に動かす際、その環境において発生しうる問題を例外と言います。
例外を想定して、発生した際に何らかの処置を入れておくことを例外処理と言います。
構文としては正しくても、動作上で問題が発生してしまうことは数多くあります。
Pythonの例外処理
a = float(input('一つ目の数字を入力してください : '))
b = float(input('二つ目の数字を入力してください : '))
c = a / b
print(c)
このプログラムも構文上は問題ありませんが、動作をさせると問題が起きるパターンが存在します。
一つ目の数字を入力してください : 1
二つ目の数字を入力してください : 0
Traceback (most recent call last):
c = a / b
ZeroDivisionError: float division by zero
二つ目の数字に0を入力するとエラーが発生します。
0で割る処理ができないためです。
このような状況で発生するエラーを例外と言います。
例外が発生するとプログラムが停止します。
ですが、この状態はプログラムが強制的に終了してしまった状態で、プログラムのことが分からない人からするとバグと変わりはありません。
プログラマは、例外についても責任をもって処理をする必要があります。
例外ハンドラ
例外が発生した場合、Pythonの実行環境はプログラムの中から、その例外が発生した場合の処理を探します。例外処理が記述されている場所を例外ハンドラと言います。
例外ハンドラが見つからない場合、プログラムは強制終了します。いわゆる落ちた状態です。
try/except/finally構文を使用することで例外ハンドラを定義することができます。
try:
a = float(input('一つ目の数字を入力してください : '))
b = float(input('二つ目の数字を入力してください : '))
c = a / b
print(c)
except ZeroDivisionError:
print('0で割ることはできません')
tryとexceptの間に書いた処理に例外が発生した場合、exceptに遷移します。
exceptとだけ書くとすべての例外をつかまえて処理をします。
exceptの後ろにスペースを空けてつかまえる例外クラスをしていると、特定の例外のみをつかまえることができます。
つかまえる例外が多いときはexceptを続けて書いていくことができます。
exceptと書くとすべてつかまえるので便利に見えますが、何の例外をつかまえて処理をしているのか分からなくなってしまいます。
処理ごとに分けて記述しましょう。
例外処理には、else構文を記述することができます。
elseを描くと例外が発生しなかった場合の処理になります。
またfinally構文は、例外が発生しても発生しなくても最後に行う処理を記述します。
try:
a = float(input('一つ目の数字を入力してください : '))
b = float(input('二つ目の数字を入力してください : '))
c = a / b
print(c)
except ZeroDivisionError:
print('0で割ることはできません')
else:
print('例外は発生していません')
finally:
print('全ての処理が終了しました')
例外処理をしっかりと記述することで、何らかの原因でプログラムが緊急停止することになっても、しっかりと終了処理を行ったうえで完了することができるので、データの破損を防いだり、利用者に対してバグで落ちたという印象を与えずに済むことになります。
Tetsuya Ikezawa
(4 months, 1 week ago)