例外処理 その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()
...
02までの数字を入力してください: g
例外が発生しました
02までの数字を入力してください: 8
例外が発生しました
02までの数字を入力してください: 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