2016-12-15 120 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,謝謝。 :) –