为什么异常不打印?

时间:2016-12-15 17:27:13

标签: python python-3.x exception exception-handling

在REPL中,我可以打印异常的字符串表示形式:

>>> print(str(ValueError))
<class 'ValueError'>
>>> print(ValueError)
<class 'ValueError'>

在这个简单的代码中,值不是打印。我错过了什么?

第一种味道:

try:
    raise ValueError
except Exception as e:
    print(str(e))
    print('We crashed!')

这只是输出我们崩溃了!

第二种味道输出相同。 print(str(e))发生了什么?

第二种味道:

def crash():
    raise ValueError

try:
    crash()
except Exception as e:
    print(str(e))
    print('We crashed!')

4 个答案:

答案 0 :(得分:2)

  

在REPL中,我可以打印异常的字符串表示形式:

>>> print(str(ValueError))
<class 'ValueError'>

不,您正在打印异常的字符串表示形式。当你这样做

raise ValueError

ValueError实际上不是引发的异常对象。 Python隐式提升ValueError(),而str 为空。

答案 1 :(得分:1)

您没有向最终创建的实例提供任何args,没有任何内容可供打印。

通过初始化并提供它作为参数来提供最终打印出来的消息:

try:
    raise ValueError("What value error?")
except Exception as e:
    print(str(e))
    print('We crashed!')
What value error?
We crashed!

另外,虽然我知道这只是一个演示,但我不得不指出在处理程序中使用Exception作为目标是不好的做法: - )

答案 2 :(得分:1)

它会打印异常消息,但您必须仔细查看:

>>> def crash():
...     raise ValueError
>>> try:
...     crash()
... except Exception as e:
...     print(str(e))
...     print('We crashed!')

We crashed!

&#34;前面的空行我们坠毁了#34;是您在执行raise ValueError时提供的错误消息(空字符串)。要使用repr而不是str来表示您的例外情况:

>>> try:
...     crash()
... except Exception as e:
...     print(repr(e))
...     print('We crashed!')
ValueError()
We crashed!

请注意raise ValueError is just a shorthand for raise ValueError()(请注意副词)。

答案 3 :(得分:1)

在user2357112中,在您的except块中回答您正在尝试打印ValueError实例而不是ValueError类。如果你想打印课程,请尝试下面的内容。

try:
    raise ValueError
except Exception as e:
    print(e.__class__)
    print('We crashed!')