我正在学习Python中的“例外” 请考虑以下代码:
def fancy_divide():
try:
print(5/0)
except Exception:
print(Exception)
如果我运行上面的代码,即
fancy_divide()
打印出<class 'Exception'>
。
但是,如果我修改代码:
def fancy_divide():
try:
print(5/0)
except Exception as ex:
print(ex)
在调用函数fancy_divide()
时打印出“除以零”
为什么会出现这种差异?
我认为'as'关键字只是为了重命名对象。
答案 0 :(得分:1)
它表示对于as
之后的范围,会有一个名为ex
的变量,该变量是从Exception
创建的。
在您的情况下,不同之处在于,在示例1中,您打印出类Exception,在示例2中,您正在打印Exception类型的对象。
>>> print(int)
<class 'int'>
>>> print(int(1))
1
>>>
我经常在打开文件时看到并使用它:
with open(filename) as f:
f.read()
在python documentation中,它有以下示例:
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
...
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
NameError: HiThere
请注意,代码不对类NameError
执行任何操作。因为他们在那个街区,他们知道它是NameError
。如果他们想对抛出的错误对象做一些事情,那么他们将不得不用as
重写代码:
>>> try:
... raise NameError('HiThere')
... except NameError as e:
... print(e)
... print('An exception flew by!')
... raise
...
答案 1 :(得分:1)
在第一个fancy_divide
函数的最后一行,您打印了Exeption
类本身,而不是Exception
类的实例。在您使用as
关键字的更新代码的第三行,您试图捕获Exception
类或其子类的实例,并将其分配给变量ex
如果您收到错误。注意:实例与实际类不同(嗯,我希望你已经知道了)
将ex
与Exception
的内容进行比较时,您可以看到这一点:
def fancy_divide_return():
try:
print(5/0)
except Exception as ex:
return Exception, ex
>>> the_class, the_instance = fancy_divide_return()
>>> the_class
<class 'Exception'>
>>> the_instance
ZeroDivisionError('division by zero',)
>>> type(the_class)
<class 'type'>
>>> type(the_instance)
<class 'ZeroDivisionError'>