例外オブジェクトが属するクラスの名前を取得します。
e.__class__.__name__
また、print_exc()関数を使用すると、エラーメッセージの重要な情報であるスタックトレースも出力されます。
このような:
from traceback import print_exc
class CustomException(Exception): pass
try:
raise CustomException("hi")
except Exception, e:
print 'type is:', e.__class__.__name__
print_exc()
# print "exception happened!"
次のような出力が得られます。
type is: CustomException
Traceback (most recent call last):
File "exc.py", line 7, in <module>
raise CustomException("hi")
CustomException: hi
そして、出力と分析の後、コードは例外を処理しないことを決定し、単に実行することができraise
ます:
from traceback import print_exc
class CustomException(Exception): pass
def calculate():
raise CustomException("hi")
try:
calculate()
except Exception, e:
if e.__class__ == CustomException:
print 'special case of', e.__class__.__name__, 'not interfering'
raise
print "handling exception"
出力:
special case of CustomException not interfering
そして、インタプリタは例外を出力します:
Traceback (most recent call last):
File "test.py", line 9, in <module>
calculate()
File "test.py", line 6, in calculate
raise CustomException("hi")
__main__.CustomException: hi
raise
元の例外がコールスタックのさらに上に伝搬し続けた後。(落とし穴の可能性に注意)新しい例外を発生させると、新しい(より短い)スタックトレースが保持されます。
from traceback import print_exc
class CustomException(Exception): pass
def calculate():
raise CustomException("hi")
try:
calculate()
except Exception, e:
if e.__class__ == CustomException:
print 'special case of', e.__class__.__name__, 'not interfering'
#raise CustomException(e.message)
raise e
print "handling exception"
出力:
special case of CustomException not interfering
Traceback (most recent call last):
File "test.py", line 13, in <module>
raise CustomException(e.message)
__main__.CustomException: hi
トレースバックに、元の例外の原因であるcalculate()
行からの関数が含まれていないことに注意してください。9
e
except:
(裸なしraise
)を除いて、多分好ましくないし、プログラムごとに一度、と。