初めてのPython(28章)

前の章に引き続き例外について

例外の種類

大きく分けて2種類

  1. ビルドイン例外
  2. ユーザ定義例外

ビルドイン例外

あらかじめ定義されている例外(クラス)で階層構造になっている。

BaseException
  Exception
    StandardError
      ArithmeticError
        FloatingPointError
....

詳細は次のようにして、Pythonのdocstringから参照できる。

>>> import exceptions
>>> help(exceptions)

ユーザ定義例外

ユーザ個々が自由に定義する例外で、Exceptionクラスを継承して作る。
Exceptionクラスを継承しているので、Exceptionをexceptに指定すれば例外を捕捉できる。

try:
  statement1
except Exception:
  statement2

ビルドイン例外はStandardExceptionのサブクラスとして定義されているので、
Exceptionをスーパークラスとして作成するユーザ定義例外と明示的に分けて例外処理が可能

try:
  statement1
except StandardError:
  # ビルドイン例外用の処理
  statement2
except Exception:
  # ユーザ定義例外用の処理
  statement3

可能とはいえ、Exceptionではなく、自分で定義した例外クラスのトップクラスを指定するのかな。
自分の作った例外以外を捕捉することは無いはずだけど、処理する範囲は出来るだけ狭めた方が良いはずだし。

また、クラスなので属性やメソッドを持たせることが出来る。
なので、例外が発生した時の処理をメソッドとしてクラスに実装することが出来る。

class MyException(Exception)
  def __init__(self, data):
    Exception.__init__(self)
    self.data = data
  def error_log(self):
    print >> sys.stderr, "Error:", data

try:
  raise MyException('hogehoge')
except MyException, error:
  errror.error_log()

raiseステートメント

クラス例外を発生させる方法は2種類

  • raise instance
  • raise class, instance

どちらの場合も、except , として例外を捕捉した時には、 に instance が代入される。