发布于 2017-03-31 04:21:28
raise从未将元组作为参数。在Python2中,语法看起来像一个元组,这就是您的困惑所在。Python3的语法发生了重大变化,删除了冗余的异常类类型,并使用关键字from代替逗号。
在Python 2中:
raise a, b, c在Python 3中变成:
raise b.with_traceback(c)发布于 2017-03-31 04:41:15
永远不要将元组传递给raise。它不会做你期望的事情。
在Python2和Python3上,raise都被记录为不接受元组。然而,Python2在raise实现中有一个weird code path,如果raise的第一个(或唯一的)参数是一个元组,它将被重复地替换为它的第一个元素,直到Python到达某个不是元组的元素。我不知道为什么这是一个东西,但它意味着像这样的东西
raise ((Exception,), "other", "tuple", "items", "get", "ignored")得到的对待就像
raise Exception这是一个demo。Python3的行为是错误的( more sensibly ),因为元组也不例外。
在Python 3上引发异常的语法已更改。Python 2语句
raise ExceptionType, value, traceback是现在
raise ExceptionType(value).with_traceback(traceback)或者,如果value是ExceptionType的一个实例,
raise value.with_traceback(traceback)不幸的是,这些语法在某种程度上是不兼容的,您甚至不能同时编写这两种语法并根据您的Python版本选择运行哪一种语法。甚至在你的代码运行之前,你就会得到一个语法错误。
解决这个问题的最简单方法是使用兼容性库。例如,使用six.reraise
six.reraise(ExceptionType, value, traceback)https://stackoverflow.com/questions/43126518
复制相似问题