在Python
2.x中,的鲜为人知的功能
raise是它可以与多个参数一起使用:的三参数形式
raise采用异常类型,异常实例和回溯。您可以使用进行追溯
sys.exc_info(),它返回(并非巧合)异常类型,异常实例和追溯。
(将异常类型和异常实例视为两个单独的参数的原因是出现异常类之前的产物。)
所以:
import sysclass MyError(Exception): passdef try_except(fn): def wrapped(*args, **kwargs): try: return fn(*args, **kwargs) except Exception, e: et, ei, tb = sys.exc_info() raise MyError, MyError(e), tb return wrappeddef bottom(): 1 / 0@try_exceptdef middle(): bottom()def top(): middle()>>> top()Traceback (most recent call last): File "<stdin>", line 1, in <module> File "tmp.py", line 24, in top middle() File "tmp.py", line 10, in wrapped return fn(*args, **kwargs) File "tmp.py", line 21, in middle bottom() File "tmp.py", line 17, in bottom 1 / 0__main__.MyError: integer division or modulo by zero
在Python 3中,这有所改变。在那里,回溯将附加到异常实例,并且它们具有
with_traceback方法:
raise MyError(e).with_traceback(tb)
另一方面,Python 3还具有异常 链接 ,这在许多情况下更有意义。要使用它,您只需使用:
raise MyError(e) from e



