例外処理 その1
実行中に発生するエラーは例外と呼ばれます。ほとんどの例外は自動的には処理されず、以下のようなメッセージを表示してプログラムを終了します。
>>> int("hoge") Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'hoge'
例外を処理する
例外によってプログラムを終了させたくない場合は、try文を使って例外を処理します。
>>> while True: ... try: ... # 例外が発生する可能性のある処理を記述 ... n = int(raw_input("数字を入力してください: ")) ... print n ... break ... except ValueError: # 補足する例外のクラス名を記述 ... # 例外が発生した場合に実行する処理を記述 ... print "例外が発生しました" ... 数字を入力してください: g 例外が発生しました 数字を入力してください: 8 8
- try節(tryとexceptの間の文)を実行する
- 例外が発生せずにtry節を終了
- except節を飛ばし、try文の後に処理を移す
- try節の中で例外が発生
- try節の残りの処理を飛ばし、発生した例外に対応するexcept節を上から順に探す
- 発生した例外に対応するexcept節が見つかった場合
- except節を実行した後、try文の後に処理を移す
- 発生した例外と一致するexcept節が見つからない場合
- try文の外に例外を渡す
複数の例外を補足する場合は( )で囲んで指定します。例外を省略した場合は全ての例外を補足します。
>>> import sys >>> list = ["a", "b", "c"] >>> while True: ... try: ... n = int(raw_input("0〜2までの数字を入力してください: ")) ... print list[n] ... break ... except (ValueError, IndexError): ... print "例外が発生しました" ... except ... sys.exit() ... 0〜2までの数字を入力してください: g 例外が発生しました 0〜2までの数字を入力してください: 8 例外が発生しました 0〜2までの数字を入力してください: 2 c
例外クラスのオブジェクトを受け取る
>>> try: ... print "hoge"[5] ... except Exception, inst: ... print inst.args # 例外オブジェクト生成時に渡された引数 ... print inst # __str__で引数を表示 ... error = inst # __getitem__で引数を受け取る ... print "error =", error ... ('string index out of range',) string index out of range error = string index out of range
上記の場合はinstという変数に例外オブジェクトが代入されていますが、別の変数名でもかまいません。また、例外オブジェクトを受け取る場合は、except節で例外クラスを指定しないといけないようです。Exceptionを指定すれば、SystemExitとKeyboardInterrupt以外の組み込み例外が補足できます。(2.5の場合)
例外を発生させる
raise文を使います。except節の中のraise文で引数を省略すると、受け取った例外クラスのオブジェクトをtry文の外側に渡します。
>>> try: ... # ここでのraise文は引数を省略できない ... raise RuntimeError("runtime error") ... except RuntimeError: ... print "例外を受け取りました" ... # ここでのraise文は引数を省略できる ... raise ... 例外を受け取りました Traceback (most recent call last): File "<stdin>", line 2, in <module> RuntimeError: runtime error