4

我正在学习 Python 中的“异常”。
考虑以下代码:

def fancy_divide():
    try:
        print(5/0)
    except Exception:
        print(Exception)

如果我运行上面的代码,即

花式除法()

它打印出来<class 'Exception'>。但是如果我修改代码:

def fancy_divide():
    try:
        print(5/0)
    except Exception as ex:
        print(ex)

它在调用函数时打印出“除以零” fancy_divide()
为什么会有这种差异?
我认为'as'关键字只是重命名对象。

4

2 回答 2

1

它说对于范围跟随as将有一个名为的变量ex,它是从创建的Exception

在您的情况下,不同之处在于,在示例一中,您打印出类 Exception,在示例二中,您正在打印 Exception 类型的对象。

>>> print(int)
<class 'int'>
>>> print(int(1))
1
>>> 

我在打开文件时经常看到并使用它:

with open(filename) as f:
    f.read()

在 python文档中,它具有以下示例:

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

请注意,代码对 class 没有任何作用NameError。因为他们在那个街区,所以他们知道这是一个NameError. 如果他们想对抛出的错误对象做些什么,那么他们将不得不重写代码as

>>> try:
...     raise NameError('HiThere')
... except NameError as e:
...     print(e)
...     print('An exception flew by!')
...     raise
...
于 2018-06-18T17:00:07.140 回答
1

在第一个函数的最后一行fancy_divide,您打印了Exeption类本身,而不是类的实例Exception。在更新代码的第三行,在您使用as关键字的地方,您试图捕获类或其子类的实例,并在出现错误时将其分配给变量。注意:一个实例与实际的类不同(好吧,我希望你已经知道了)Exceptionex

当您比较exto的内容时,您可以看到这一点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'>
于 2018-06-18T17:58:38.060 回答