以下代码中的'as'关键字是做什么的?

时间:2018-06-18 16:52:31

标签: python python-3.x

我正在学习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'关键字只是为了重命名对象。

2 个答案:

答案 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如果您收到错误。注意:实例与实际类不同(嗯,我希望你已经知道了)

exException的内容进行比较时,您可以看到这一点:

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'>