
60秒以内にPythonのエラーが発生した場合に使える例外処理入門〈講座12〉
今回は例外処理について見ていきましょう。
例外処理とは
簡単にいえば、エラー(例外)が発生しそうな場所であらかじめ処理を記述しておき、例外が発生したときに適切な処理を行うようにします。
問題から回復可能であれば復帰させますし、回復が不可能であれば安全にプログラムを終了させます。
例えば割り算のメソッドがあって、わざと 0 除算をしてみまると、エラーが出てくるのですが、この時にわかりやすいメッセージを出したり別の処理をしたい場合に例外の仕組みが使えます。
def divide(x, y):
return x / y
divide(100, 0)
例外の発生しそうなところをとりあえず try: で囲ってあげて except で例外を補足してあげます。
def divide(x, y):
try:
return x / y
except ZeroDivisionError:
print("0では除算できません")
divide(100, 0)
非常に単純な例ですが、割り算を実行する関数に0を渡して、0除算を行っています。
このプログラムを実行すると、0除算エラー(ZeroDivisionError)が発生して停止してしまいます。
0除算は簡単に予期できるため、次のように例外処理を行うとよいでしょう。
それから、例外が発生しなかった時の処理は print("例外は発生しませんでした") としてあげます。
それから例外が発生しようがしまいが、最後に処理を行いたい場合は finally: の後に書いてあげれば OK です。
では今回適当に print("終了処理") としてあげます。
def divide(x, y):
try:
result = x / y
print("例外は発生しませんでした")
return result
except ZeroDivisionError:
print("0では除算できません")
finally:
print("終了処理")
divide(100, 0)
divide(100, 10)
ではこのようにしてあげると
それから ZeroDivisionError は Python があらかじめ用意してくれた例外なのですが、独自の例外を作りたい時もあります。
どうするかというと、Python が用意している Exception クラスを継承して独自の例外を作ってあげれば OK です。
次のような例をみてみましょう。
class DateRangeError(Exception):
def __str__(self):
return "日付の範囲ではありません"
def printDate(year, month, day):
if not (year > 0 and 0 < month < 13 and 0 < day < 32):
raise DateRangeError()
print("{0}/{1}/{2}".format(year, month, day))
printDate(2017, 8, 10)
printDate(2017, 8, 32)
この例では、日付をフォーマットして出力する関数で、日付の範囲をチェックしています。
日付の範囲から外れている場合、オリジナルの例外の”DateRangeError”を投げています。
オリジナルの例外はExceptionクラスのサブクラスとして定義し、それをraise句でインスタンス化しています。
エラー時のメッセージをよりわかりやすくするために、例のように__str__をオーバーロードしておくとよいでしょう。
想定通りになっているのがわかるかと思います。
こういった例外の処理もよく使うので、慣れておくようにしてください。
以上
よろしくお願いいたします。