Nicolas Fleury wrote: > 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] > How about dropping reraise and changing: reraise(...) to: addinfo(...) raise
Where addinfo looks like: def addinfo(exception, additionalInfo): strFunc = getattr(exception, "__str__", None) if not isinstance(strFunc, ExceptionStr): strFunc = ExceptionStr(str(exception)) exception.__str__ = strFunc strFunc.addinfo(additionalInfo) So you finale would be: if __name__ == '__main__': def foo(): raise AttributeError('Test') def bar(): foo() try: try: try: bar() except Exception, exception: addinfo(exception, "While doing x:") raise except Exception, exception: addinfo(exception, "While doing y:") raise except Exception, exception: addinfo(exception, "While doing z:") raise --Scott David Daniels [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list