Hi,
I've made a small utility to re-raise an exception with the same stack
as before with additional information in it. Since I want to keep the
same exception type and that some types have very specific constructors
(which take, for example, more than one parameter), the only safe way I
have found to made it is by hacking the str representation:
import sys
class ExceptionStr:
def __init__(self, content):
self.content = content
self.infos = []
def addinfo(self, info):
self.infos.insert(0, info)
def __call__(self):
return '\n' + '\n'.join(self.infos + [self.content])
def reraise(exception, additionalInfo):
strFunc = getattr(exception, "__str__", None)
if not isinstance(strFunc, ExceptionStr):
strFunc = ExceptionStr(str(exception))
exception.__str__ = strFunc
strFunc.addinfo(additionalInfo)
raise exception, None, sys.exc_info()[-1]
if __name__ == '__main__':
def foo():
raise AttributeError('Test')
def bar():
foo()
try:
try:
try:
bar()
except Exception, exception:
reraise(exception, "While doing x:")
except Exception, exception:
reraise(exception, "While doing y:")
except Exception, exception:
reraise(exception, "While doing z:")
Suppose the resulted traceback is:
Traceback (most recent call last):
File "somefile.py", line 52, in ?
reraise(exception, "While doing z:", MyException)
File "somefile.py", line 50, in ?
reraise(exception, "While doing y:", Exception)
File "somefile.py", line 48, in ?
reraise(exception, "While doing x:")
File "somefile.py", line 46, in ?
bar()
File "somefile.py", line 40, in bar
foo()
File "somefile.py", line 38, in foo
raise AttributeError('Test')
AttributeError:
While doing z:
While doing y:
While doing x:
Test
I would like to know how to code the reraise function so that the lines
48, 50 and 52 don't appear in the stack. Is it possible?
Thx and regards,
Nicolas
--
http://mail.python.org/mailman/listinfo/python-list