Python尝试...除了逗号与'as' in except

Posted

技术标签:

【中文标题】Python尝试...除了逗号与\'as\' in except【英文标题】:Python try...except comma vs 'as' in exceptPython尝试...除了逗号与'as' in except 【发布时间】:2011-02-01 21:46:24 【问题描述】:

except语句中的','和'as'有什么区别,例如:

try:
    pass
except Exception, exception:
    pass

和:

try:
    pass
except Exception as exception:
    pass

第二个语法在 2.6 中合法吗?它在 Windows 上的 CPython 2.6 中工作,但 cygwin 中的 2.5 解释器抱怨它无效。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

最终文档是PEP-3110: Catching Exceptions

总结:

在 Python 3.x 中,需要使用 as 将异常分配给变量。 在 Python 2.6+ 中,使用 as 语法,因为它的歧义性要小得多,并且与 Python 3.x 前向兼容。 在 Python 2.5 及更早版本中,请使用逗号版本,因为不支持 as

【讨论】:

使用 as 是在 Python 3.x 中将异常分配给本地的唯一方法。但是as 不是必需的,因为如果您根本不需要它,则不必指定它。【参考方案3】:

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

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

>>> 
woo hoo

更新:使用as 语法还有另一个原因。正如其他人所指出的,使用, 会使事情变得更加模棱两可;这就是与众不同的地方。从 Python 2.6 开始,multicatch 允许您使用 catch multiple exceptions in one except block。在这种情况下,说起来更具表现力和pythonic

except (exception1, exception2) as e

而不是说

except (exception1, exception2), e

这仍然有效

【讨论】:

Python 版本 before 2.6 也允许您使用元组来捕获多种异常类型。但是语法令人困惑;你会使用except NameError, ValueError: 然后想知道为什么ValueError 异常从未被捕获。或使用except (NameError, e): 并留下NameError 用于'e'【参考方案4】:

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

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

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

【讨论】:

注意:这里有一些特殊情况需要注意。在 Py3 中,一旦您退出 except 块,as 目标(以及其余异常信息)就会隐式地 deled(这可以防止存储的回溯中涉及的一些循环引用延迟释放内存,直到循环 GC 开始运行)。因此,这个等效代码的等效性稍差,除非您在 except 块中使用 try/finally 以确保在退出 except 块之前执行 del e【参考方案5】:

从 Python 3.7(不确定其他版本)开始,不再支持“逗号”语法:

源文件exception_comma.py:

try:
    result = 1/0
except Exception, e:
    print("An error occurred")
    exit(1)

exit(0)
$ python --version --> Python 2.7.10
$ python exception_comma.py
An error occurred
$ python3 --version --> Python 3.7.2
$ python3 exception_comma.py
  File "exception_comma.py", line 3
    except Exception, e:
                    ^
SyntaxError: invalid syntax

【讨论】:

以上是关于Python尝试...除了逗号与'as' in except的主要内容,如果未能解决你的问题,请参考以下文章

SQL IN 逗号分隔参数与内部查询

python输入与输出

Kotlin中的? 、?. 、?: 、!!、as?

mysql 两个以逗号分隔字段怎么匹配

尝试/除了使用 Python requests 模块的正确方法?

Python CodeLab 关于异常的问题——尝试,除了 ValueError