プログラムの実行中に例外(エラー)が発生した場合、通常はエラー内容を表示してプログラムは停止します。しかし、致命的なエラーでなければ、実行を中断せずに発生した例外に応じた処理を行いたいことがあります。このような処理を例外処理と呼びます。今回は Python での例外処理の方法について説明します。
例外処理とは
例外処理とは、エラーが発生した場合に現在の処理を停止し別の処理を行うをことです。
たとえば、ユーザーが入力時に数値を入力するべきところに文字列を入力し、エラーが発生するようなプログラムがあるとします。この場合、例外処理を行っていない場合、エラーが発生した時点でプログラムが終了してしまいます。しかし、プログラムを利用するユーザーは、「数値を入力してください」などと表示された後に、プログラムの動作が続けられることを期待します。
このような場合、例外処理を用いることによって、エラーが発生してもプログラムを停止せずに、処理を続けることが可能になります。またこの例の他にも、プログラムの途中でエラーが発生した場合、データの整合性が取れるように今まで行った変更を元に戻すといった後処理を行う場合にも例外処理が使えます。
例外処理の方法
例外処理の記述方法は以下の通りです。
1 2 3 4 5 6 7 8 |
try: 例外が発生する可能性がある処理 except 例外クラス名: 例外が発生した場合の処理 else: 例外が発生しなかった場合の処理 finally: 例外が発生してもしなくても実行する処理 |
else 節と finally 節は省略することができます。また、except 節は指定した例外クラスの例外が発生した場合に、処理が実行されます。もし例外クラス名を指定しなかった場合は、どの例外クラスの例外が発生した場合でも except 節が実行されます。
try 節で例外が発生すると、try 節の処理は途中で中断しスキップされ、except 節が実行されます。発生した例外クラスが except 節で指定した例外クラス名と一致する場合は、 except 節に記述した処理が実行されます。また、try 節の処理が正常に実行された場合は、else 節の処理が実行されます。
また、finally 節の処理は例外が発生してもしてなくても、処理が実行されます。
例外処理のサンプル
今回は、以下のサンプルプログラム(sample.py)を用いて説明します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# -*- coding: utf-8 -*- def div(): try: print("Input x: ") x = input() print("Input y: ") y = input() result = int(x) / int(y) except ZeroDivisionError: print("0では割り切れません") div() else: print result if __name__ == "__main__": div() |
このプログラムは標準入力で、x と y の値を入力し、x / y を計算するプログラムです。
まずは、正常に動作するパターンで実行してみます。
1 2 3 4 5 6 |
$ python sample.py Input x: 10 Input y: 2 5 |
上の例では x に 10、y に 2 を入力しています。例外は発生しないので、 else 節が実行され計算結果の 5 が表示されます。次は例外が発生するパターンです。y に 0 を入力します。
1 2 3 4 5 6 7 |
$ python sample.py Input x: 100 Input y: 0 yに0は入力できません Input x: |
この例では x に 10、y に 0 を入力しています。その結果、 0 で除算したときに例外(ZeroDivisionError)が発生し except 節が実行され、「yに0は入力できません」と表示されます。そして、もう一度 x の入力が要求されます。このように例外処理を用いることで、プログラムを停止させずに処理を継続することができます。