Уважаемые товарищи python-девелоперы,

Eсли кто не знает, или не помнит, или не задумывался об этом.

Если вы хотите обернуть внутреннюю ошибку в новое исключение (“сделать reraise”), например, в таком коде:

try:
    do_something()
except Exception, e:
    raise e

То внутренние фреймы стека у вас забудутся, первым фреймом будет строчка с raise e

Если вы не хотите терять внутренние фреймы, пишите так:

import sys

try:
    do_something()
except Exception, e:
    raise Exception, "MyException", sys.exc_info()[2]

так:

import sys

try:
    do_something()
except Exception, e:
    raise Exception("MyException"), None, sys.exc_info()[2]

или так:

try:
    do_something()
except Exception, e:
    raise

Обернуть исключение как в Java через throw MyException(e) увы нельзя, т.е. внутреннее сообщение потеряется, останется только внешнее. Но вы можете запихать дополнительное сообщение в отдельное поле Exception-обёртки, и написать ваш красивый код, который покажет стек.

Add post to: Delicious Reddit Slashdot Digg Technorati Google