我参加了一个针对初学者的 Python 讲座,其中某个主题没有得到很好的解释。那么这有什么作用e
呢?
def x(a, b):
try:
return a / b
except ZeroDivisionError, e:
return 0
我参加了一个针对初学者的 Python 讲座,其中某个主题没有得到很好的解释。那么这有什么作用e
呢?
def x(a, b):
try:
return a / b
except ZeroDivisionError, e:
return 0
捕获的异常分配给 name e
。您可以选择任何有效的 Python 标识符:
except ZeroDivisionError, caught_exception:
这使您可以使用捕获的异常;也许是为了打印错误消息,或者将异常的属性用于其他目的。请参阅 Python 教程的处理异常章节。
该except <Exception>, <name>:
语法已被弃用,取而代之的是:
except ZeroDivisionError as e:
这更具可读性,并且避免了与捕获多种异常类型的语法混淆:
except (ZeroDivisionError, ValueError):
由于您发布的功能不使用e
,因此可以完全安全地删除它:
def x(a, b):
try:
return a / b
except ZeroDivisionError:
return 0
由于 ZeroDivisionError 不是解释“e”目的的一个很好的例子(可能是你不清楚的原因),我将用一个不同的错误来解释
异常:通常,当 Python 程序遇到无法继续的情况(错误代码)时,它会引发异常。异常是表示错误的 Python 对象。
在你的 Python 解释器上,如果你对未定义的变量(或实例)做任何事情,你会得到这样的错误
>>> a = 1
>>> print a
1
>>> print b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
>>>
NameError是引发的异常的名称
name 'b' is not defined是引发异常的附加信息
让我们对 try 和 except 块重复相同的操作
>>>
>>>
>>> try:
... print a
... print b
... except NameError:
... print "I got NameError"
...
1
I got NameError
>>>
输出没有明确说明导致此异常的变量/实例。您可能会觉得,如果您可以访问口译员提供的其他信息,您可以处理此问题
这就是可选参数(除)“e”或您想要调用的任何参数变得方便的地方
>>> try:
... print a
... print b
... except NameError, e:
... print "I got NameError"
... print "Addition Information is:", e
...
...
1
I got NameError
Addition Information is: name 'b' is not defined
>>>
正如其他人指出的那样,建议使用以下约定
except NameError as e
它将捕获的错误生成的消息保存在名称中e
。下面是一个演示:
>>> 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>>
>>> try:
... 1/0
... except ZeroDivisionError, e:
... print e
...
integer division or modulo by zero
>>>
但是,您应该注意两件事。首先是您不需要使用名称e
。您可以选择所需的任何变量名称。其次,您提供的语法已被弃用,取而代之的是:
except Exception as e:
另外,我想补充一点,您的特定功能可以这样重写:
def x(a, b):
return a/b if b else 0
有 try/except 块是不必要的,e
因为函数从不使用它,所以确实没有必要。