2016-12-15 123 views
0

在REPL,我可以打印一个异常的字符串表示:为什么Exception不打印?

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

回答

2

在REPL,我可以打印一个异常的字符串表示:

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

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

raise ValueError 

ValueError是不是实际上是被抛出的异常对象。 Python隐含地提高了ValueError(),而str表示为空。

1

你没有提供任何参数传递给该最终创建的实例,就没有什么可打印。

供应,这将最终会被初始化,并作为参数提供它打印出来的消息:

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

而且,虽然我知道这仅仅是一个示范,我不得不指出的是,使用Exception作为在你的处理器的目标是不好的做法:-)

+0

四个答案完成彼此,所以很难挑选一个。 +1,谢谢。:) –

1

它不打印异常消息,但你必须仔细一看:

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

We crashed! 

在“我们哗啦啦”前面的空行是你在做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()(注意paranthesis)。

+0

四个答案完成彼此,所以很难选择一个。 +1,谢谢。 :) –

1

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

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

四个答案完成彼此,所以很难挑选一个。 +1,谢谢。 :) –