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

このように2つ目の数字に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の後ろにスペースを空けてつかまえたい例外クラスを指定すると、特定の例外のみをつかまえることができます。ここではZeroDivisionErrorと指定しました。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('全ての処理が終了しました')

まとめ

例外処理をしっかりと記述することで、何らかの原因でプログラムが緊急停止することになっても、しっかりと終了処理を行ったうえで完了することができます。この設定があることでデータの破損を防ぐことにも繋がるので、プログラマとしては押さえておきたいポイントですね。

Pythonを基礎から勉強したい方向けの入門コース実施中!