Pythonのraise文の使い方|コード例を用いてわかりやすく解説

この記事でわかること
Pythonのraiseとは?
Pythonのraiseとは自分が作った関数やクラスを実行中にエラーが発生した場合、それを外部に伝える例外を発生させるための文です。
raise文で発生させることができる例外は、既存の(組み込み)例外以外にも独自の例外を作成することが可能です。独自の例外クラスを作成することでエラー処理が簡潔に記述できるようになることもあります。
以下に紹介するコマンドやプログラムはPython3上で動作させてください。Python2では動作しません。動作確認はWindows10とPython3.9.1で行いました。
Pythonにおける例外とは?
raise文の前に「例外」について少し解説します。
Pythonの「例外」とは、Pythonのプログラム実行中に発生するエラー(ランタイムエラー)のことを「例外」と呼んでいます。
比較的分かりやすいエラーとしては「変数がまだ使われていないのに参照しようとしたとき」にはNameError例外が発生しますし、「int型の引数にstr型を渡してしまったとき」にはValueError例外が発生します。その他にもたくさんの「例外」があります。
例外が発生するとプログラムはそこで停止してしまいます。しかし、それを検出してプログラムを継続する方法もあります。
raise文はこの「例外」を意図的に発生させるための文です。「例外」を意図的に発生させることでエラー処理がすっきりと簡単に記述できることもありますので、この機会に覚えましょう。
raise文を使ってみる
既存の例外クラスを使う場合には、例えば下記のプログラムのようにすると既存のNameError例外を発生させ、また検出することができます。
tryのブロックに例外が発生する可能性があるコードを記述します。下記の例ではraise文でNameError例外を強制的に発生させています。NameError例外を検出するとexceptのNameErrorブロックが実行されます。
1 2 3 4 5 6 7 |
# Python3で動作させてください。 # Python3.9.1で動作確認しました。 try: # 例外が発生する可能性があるコードを記述します raise NameError("ネームエラーです") # raise文で例外を発生させています except NameError as e: # NameErrorが発生すると、ここに来ます print(e) # 「ネームエラーです」と表示されます |
独自の例外クラスを作る
独自の例外クラスはExceptionクラスを継承するかExceptionクラスを祖先に持つクラスを継承して作ることができます。
下記のプログラムでは独自の例外クラスであるOriginalErrorクラスを定義して、func関数のraise文でOriginalError例外を発生させています。OriginalErrorの引数はexceptの所の変数eに渡されるため、結果としてprint文でメッセージが表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Python3で動作させてください。 # Python3.9.1で動作確認しました。 # 独自の例外クラス # Exceptionクラスを継承しているだけで、何も定義していないクラス class OriginalError(Exception): pass # 何もしないことを表す特殊な命令です # OriginalError例外を発生させる関数 def func(): raise OriginalError("OriginalErrorです。") # OriginalErrorを発生させています # 例外発生・検出 try: # 例外が発生する可能性があるコードを記述します func() # この関数内で例外が発生する可能性があります except OriginalError as e: # OriginalError例外が発生すると、ここに来ます print(e) # 「OriginalErrorです。」と表示されます |
例外クラスとその他の処理
上の項では独自の例外クラスを作成しましたので、もう少し実用的な例となる処理を追加することにします。
表示されるメッセージはraise文の所で指定しましたが、仮に同じメッセージを常に表示するのであれば引数で渡すのではなく例外クラスの定義の所に記述することができます。
特殊メソッドの__str__を用いることで例外発生時のメッセージをreturn文で返すことができます。
同時にTestClassクラスを作成し、割り算(div)の所でゼロ除算が発生する前にOriginalError例外を発生させてみることにします。
Pythonにはtracebackというモジュールがありまして、エラー発生時に「どのように関数が呼び出され、どこでエラーが発生したか」を特定できるものです。このtracebackというモジュールも使ってみることにします。
下記のサンプルプログラムはsample.pyとして保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# sample.pyです。 # Python3で動作させてください。 # Python3.9.1で動作確認しました。 import traceback # トレースバックモジュールをインポート # 独自の例外クラス class OriginalError(Exception): def __str__(self): # 特殊メソッド(戻り値はstr型でなければなりません) return "このErrorが表示されます。" # テスト用のクラス class TestClass(): def add(self,a,b): # 加算するメソッド return a+b def div(self,a,b): # 除算するメソッド if b==0: # ゼロ除算になるときは raise OriginalError() # OriginalErrorを発生させます return a/b # OriginalError例外を発生させる関数 def func(): o = TestClass() print( o.add(3,5) ) # 8 print( o.div(6,2) ) # 3.0 print( o.div(3,0) ) # 例外発生 print( o.div(10,5) ) # (上の行で例外が発生するため)実行されません # 例外発生・検出 try: # 例外が発生する可能性があるコードを記述します func() # この関数内で例外が発生する可能性があります except OriginalError as e: # OriginalError例外が発生すると、ここに来ます print(e) # 「このErrorが表示されます。」と表示されます traceback.print_exc() # OriginalErrorのスタックトレースを表示 |
Pythonのraise文の使い方
raise文は例外を発生させるための文です。例外クラスは既存の例外クラス以外にも独自の例外クラスを作成することができます。
raise文と独自例外クラスおよびスタックトレースが有効なのは、プログラムをほぼ開発し終わって実際に動かしているときに、時々発生するようなエラーに対応するときでしょう。もちろん開発中のときでも役に立ちますが、きっとデバッガの方が活躍するでしょう。
長期で付き合うようなプログラムを作成するときで、致命的なエラーが発生しそうな所には、エラーを検出するコードを記述してraise文で例外を発生するようにしておくと良いでしょう。そのときスタックトレースの表示もするようにしておきましょう。
最後に
以上、raise文とそれに関連する処理について解説しました。「例外」を上手に使うと処理をすっきりと書けることがありますので使えるようになりましょう。