メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2008年2月26日火曜日

[Python][お勉強] Python入門(65) - 文字列例外、クラス例外

今日もPythonのお勉強。

今日は、exceptの見出し行やraiseのname部についてやる。
まず文字列例外。

name部には文字列オブジェクトかクラスオブジェクト、またはインスタンスオブジェクト
を指定できるとのこと。で、そのうちの文字列オブジェクトの方から。

文字列例外
Pythonでは文字列オブジェクトを「例外」にすることができる。


>>> e = "abc"
>>> try:
... raise e
... except e:
... print 'abeshi'
...
abeshi
>>>
 

ここでの注意点は、raiseするオブジェクトとexcpetのname部に指定するオブジェクトの
リファレンスを同一にしなければならないということ。
文字列を指定できるのではなく、オブジェクトを指定できるということで、
さらにリファレンス値を同じにしなくてはならない。


クラス例外
クラス例外は文字列例外と違って、同一のオブジェクトかどうかでは実行するexceptブロックを決定しない。
クラス例外の場合は、「同一のオブジェクトツリー」に属しているかどうかで実行するexceptブロックを決定する。

>>> class C1: pass
...
>>> class C2(C1): pass
...
>>> class C3: pass
...
>>> try:
... raise C2
... except C1:
... print 'abc'
...
abc
>>> try:
... raise C1
... except C1:
... print 'abc'
...
abc
>>> try:
... raise C3
... except C1:
... print 'abc'
...
Traceback (most recent call last):
File "", line 2, in ?
__main__.C3: <__main__.c3>
>>>


クラスC1とC2、C3を用意した。C2はC1のサブクラスで、C3は独立している。
このとき、C2の例外はC1で受け取れる。つまりexcept C1:と記述したブロックが実行される。
C3の例外の場合C1では受け取れない。つまりC1とは別のオブジェクトツリーに属しているから。


また、クラス例外をraiseする際、Pythonの中では必ずインスタンスが必要になるとのこと。
上記の例では、

raise C1
 

と、クラス名を指定しているが、この実態は、

raise C1()
 

と同義、とのこと。

さらに、raiseでは必ずインスタンスが必要なのだが、発生する例外は
あくまで「クラス」なので、exceptブロックにはクラス名を指定する必要がある。


また、クラス例外用のクラスを定義する場合、
「強制されているわけでは無いが、クラス例外を自分で作る際は、ビルトイン例外のExceptionを継承すべき」とのこと。




おしまい。
.

0 コメント: