開発環境
- OS X Lion - Apple(OS)
- TextWrangler(Text Editor) (BBEditの無料機能制限版、light版)
- Script言語: Python
『初めての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 コメント:
コメントを投稿