今日も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 コメント:
コメントを投稿