見出し画像

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)          


ではこのようにしてあげると

画像1

それから 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__をオーバーロードしておくとよいでしょう。

画像2


想定通りになっているのがわかるかと思います。


こういった例外の処理もよく使うので、慣れておくようにしてください。

以上

よろしくお願いいたします。               

この記事が気に入ったらサポートをしてみませんか?