2008年2月26日火曜日

Be happy with loggin' raise

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
コード

#!/usr/bin/python
import logging

def raiser():
try:
1/0.0
except:
logging.exception('my except:')
raise

try:
raiser()
except Exception, why:
print 'printing', why
print 'printing', why.__class__


実行結果

[nori@Asama]/usr/lib64/python2.4% python ~/Desktop/work/test/loggingexception.py
ERROR:root:my except:
Traceback (most recent call last):
File "/home/nori/Desktop/work/test/loggingexception.py", line 6, in raiser
1/0.0
ZeroDivisionError: float division
printing float division
printing exceptions.ZeroDivisionError
[nori@Asama]/usr/lib64/python2.4% fg


「式を伴わない場合、raise は現在のスコープで最終的に有効になっている式を再送出します。そのような式が現在のスコープに全くない場合、エラーを示す例外が送出されます。」とあり、「最終的に有効になっている式」ってピンとこなかったけど発生したexceptionらしい。

蛇足:
「try 文には二つの形式: try...except および try...finally があります。これら二つの形式を混合することはできません (互いにネストすることはできます)。」とtry文の説明にありますが、python2.5ではできます。悪い機能じゃないけど、これだけが理由で2.5以前のpythonで動かなくなるのはアホ過ぎる。ネストすればいいだけだし、2.4以前を使っているディストリはそれなりにあるからだ。

参照:
6.9 raise 文 @ Python リファレンスマニュアル
7.4 try 文 @ Python リファレンスマニュアル
2.4 組み込み例外 @ Python ライブラリリファレンス

1 件のコメント:

nori さんのコメント...

google codeで発見した
類似コード