2012年3月3日土曜日

開発環境

『初めてのPython 第3版』(Mark Lutz 著、夏目 大 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-393-7)のVII部(例外)28章(文字列例外とクラス例外)練習問題を解いてみる。

1.

文字列例外のマッチングは、両方が同じ「オブジェクト」であるか、ということを基準に、つまり、発生した例外と、exceptブロックに指定された例外とが、is(==ではなく)によって比較される。

2.

クラス例外のマッチングは、両方が同じツリー上に属するクラスであるかどうかということを基準に行われる。発生したれ害のクラスが、exceptブロックに指定された例外と同じ場合や、exceptブロックに指定された例外のサブクラスである場合に、「一致している」とみなされる。

3.

クラス例外にステート情報を付加するには、インスタンス属性に値を代入すればいい。

また、それを例ガンハンドラで使用するには、値を代入した変数や、その変数ををメソッドで呼び出して使用するなどすればいい。

4.

クラス例外のエラーメッセージは、文字列変換に対応するフックメソッド、__repr__、__str__などを例外クラスに持たせて戻り値に指定すればいい。

5.

文字列例外をもう使用すべきではない理由は、Pythonの将来のバージョンで文字列例外はサポートされなくなるから。(サポートされなくなる理由はクラス例外の方が便利だから。)

いろいろと確認。

コード(TextWrangler)

#!/usr/bin/env python
#encoding: utf-8

class CustomError:
 def __init__(self,data):
  self.data = data
 def __str__(self):
  return 'custom error'

class Sub(CustomError):
 def __str__(self):
  return 'sub error'

def raiser0():
 raise CustomError('python 0')

def raiser1():
 raise Sub('python 1')

if __name__ == '__main__':
 for f in (raiser0,raiser1):
  try:
   f()
  except CustomError,e:
   import sys
   print 'error at',e.data
   print 'caught: ',sys.exc_info()[0]

入出力結果(Terminal)

$ ./python_program.py
error at python 0
caught:  __main__.CustomError
error at python 1
caught:  __main__.Sub
$ python
Python 2.7.2 (default, Feb 12 2012, 23:50:38) 
[GCC 4.2.1 Compatible Apple Clang 3.0 (tags/Apple/clang-211.12)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from python_program import *
>>> raiser0()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "python_program.py", line 15, in raiser0
    raise CustomError('python 0')
python_program.CustomError: custom error
>>> raiser1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "python_program.py", line 18, in raiser1
    raise Sub('python 1')
python_program.Sub: sub error
>>> quit()
$

0 コメント:

コメントを投稿