Python试试…除逗号与“ as”外


246

在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中均有效,那我应该使用哪个?

Answers:


284

权威性文件是PEP-3110:捕获异常

摘要:

  • 在Python 3.x中,使用as要求对异常分配给一个变量。
  • 在Python 2.6+中,请使用as语法,因为它的模棱两可远,并且与Python 3.x向前兼容。
  • as不支持Python 2.5和更早版本的情况下,请使用逗号版本。

16
使用as是在Python 3.x中将异常分配给本地的唯一方法。但as不是必需的,因为如果根本不需要它,则不必指定它。
墨卡托

38

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

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

>>> 
woo hoo

更新:使用该as语法还有另一个原因。,正如其他人指出的那样,使用会使事情变得更加模棱两可。这就是与众不同的原因。从Python 2.6开始,有multicatch一个功能允许您在一个代码except块中捕获多个异常。在这种情况下,说起来更具表现力和Python风格

except (exception1, exception2) as e

而不是说

except (exception1, exception2), e

仍然可以工作


13
2.6 之前的 Python版本也允许您使用元组来捕获多种异常类型。但是语法令人困惑;您可能会except NameError, ValueError:想知道为什么ValueError从来没有捕获到异常。或使用except (NameError, e):了,留下了一NameError'e'
马丁·彼得斯

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])

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


2
注意:这里有一些特殊情况需要注意。在Py3中,as目标(以及其余异常信息)del在退出该except块后即隐含地被执行(这防止了存储回溯中涉及的某些循环引用延迟了内存的释放,直到循环GC开始运行为止) )。因此,该等效代码略微等效,除非您try/finally在该except块内使用a 来确保del e在退出该except块之前执行了该代码。
ShadowRanger

0

从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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.