Python尝试...除了逗号vs'as'之外

Pet*_*ham 240 python python-2.6

除语句中','和'as'之间有什么区别,例如:

try:
    pass
except Exception, exception:
    pass
Run Code Online (Sandbox Code Playgroud)

和:

try:
    pass
except Exception as exception:
    pass
Run Code Online (Sandbox Code Playgroud)

第二种语法在2.6中合法吗?它适用于Windows上的CPython 2.6,但cygwin中的2.5解释器抱怨它无效.

如果它们在2.6中都有效,我应该使用哪个?

Amb*_*ber 278

最终文件是PEP-3110:捕捉异常

摘要:

  • 在Python 3.x中,需要使用as为变量分配异常.
  • 在Python 2.6+中,使用as语法,因为它不那么模糊,并且与Python 3.x向前兼容.
  • 在Python 2.5及更早版本中,使用逗号版本,因为as不受支持.

  • 使用`as`是在Python 3.x中将异常分配给本地的唯一方法.但是`as`不是_required_,因为如果你根本不需要它,你就不必指定它. (15认同)

ins*_*get 38

是的,这是合法的.我正在运行Python 2.6

try:
    [] + 3
except Exception as x:
    print "woo hoo"

>>> 
woo hoo
Run Code Online (Sandbox Code Playgroud)

更新:使用as语法还有另一个原因.,正如其他人指出的那样,使用会使事情变得更加含糊不清; 而这就是产生差异的原因.从Python 2.6开始,multicatch允许您在一个except块中捕获多个异常.在这种情况下,它更具表现力和pythonic

except (exception1, exception2) as e
Run Code Online (Sandbox Code Playgroud)

而不是说

except (exception1, exception2), e
Run Code Online (Sandbox Code Playgroud)

这仍然有效

  • 在*2.6之前的Python版本*允许您使用元组来捕获多个异常类型.但语法令人困惑; 你会使用除NameError之外的`,ValueError:`然后想知道为什么永远不会捕获`ValueError`异常.或者使用`except(NameError,e):`并且为''e'留下了`NameError`! (13认同)

Ale*_*nor 17

"as"语法是未来的首选语法,但如果您的代码需要使用较旧的Python版本(2.6是第一个支持新版本),那么您将需要使用逗号语法.


小智 9

如果你想支持所有的python版本,你可以使用sys.exc_info()函数,如下所示:

try:
    a = 1/'0'
except (ZeroDivisionError, TypeError):
    e = sys.exc_info()[1]
    print(e.args[0])
Run Code Online (Sandbox Code Playgroud)

(来源:http://python3porting.com/noconv.html)

  • 注意:这里有一些角落案例需要注意.在Py3中,只要退出`except`块,就会隐式地"删除"`as`目标(以及其余的异常信息)(这可以防止存储的回溯中涉及的某些循环引用延迟释放内存直到循环GC开始运行).所以这个等效代码稍微不那么等效,除非你在`except`块中使用`try/finally`来确保在退出`except`块之前执行`del e`. (2认同)