您可以设置__traceback__
属性:
except Exception as e:
et, ei, tb = sys.exc_info()
ei.filename = filename
ei.__traceback__ = tb
raise ei
or call .with_traceback()
直接在旧实例上:
except Exception as e:
et, ei, tb = sys.exc_info()
ei.filename = filename
raise ei.with_traceback(tb)
However,回溯已经自动附加,不需要重新附加它,真的。
See the raise声明文件 http://docs.python.org/3/reference/simple_stmts.html#the-raise-statement:
当引发异常时,通常会自动创建回溯对象并将其作为__traceback__
属性,可写。
在这种特定情况下,也许您想要一个不同的异常,并带有上下文?
class FilenameException(Exception):
filename = None
def __init__(self, filename):
super().__init__(filename)
self.filename = filename
try:
something(filename)
except Exception as e:
raise FilenameException(filename) from e
这将创建一个链式异常,如果未捕获,则将打印两个异常,并且原始异常可用作newexception.__context__
.