2017-04-25 31 views
3

我想了解引發ValueError和異常之間的區別。我已經嘗試在相同的代碼(即使在同一個分支),結果是相同的 - 我收到了一條錯誤消息。Python:ValueError和Exception之間的區別?

我對這個問題做了一個研究,但沒有發現有關這方面的討論。然後我讀異常的文檔,發現ValueError異常以下definition

Raised when a built-in operation or function receives an argument that has the right type but an inappropriate value, and the situation is not described by a more precise exception such as IndexError .

所以,按照我的理解,一個例外是一個更通用的術語,並且可以ValueError錯誤在某些特定情況下可以應用。但既然提出這兩件事的結果是一樣的,我想明白,區分ValueError和Exception的實際意義是什麼。 Python版本應該在這裏不相關。謝謝!

編輯: 感謝您的答案我明白了,這兩個術語在try-exception構造中有什麼區別。但是,在提高它們的情況下它們又有什麼不同,而不是除外?

raise Exception('blah') 

raise ValueError('blah') 

回答到@PeterWood:在這兩種情況下我剛剛得到了錯誤信息「嗒嗒」,但在一種情況下,它是「例外:胡說」,並在第二個: 「ValueError:blah」。我在這種情況下看到他們倆之間沒有實際的區別。

+0

你是什麼意思*「結果...是相同的」*?哪個結果?你沒有向我們展示過任何東西。 –

+0

@PeterWood _「結果是一樣的 - 我收到了錯誤信息。」_ –

+0

@PeterWood我編輯了我的問題,請看看它。 –

回答

7

ValueError繼承自Exception。您可以決定只捕獲ValueErrorException,這是異常繼承的用途。

在這個例子中:

try: 
    a=12+"xxx" 
except Exception: 
    # exception is trapped (TypeError) 

捕獲異常,所有異常(除BaseException例外)由except聲明被困。

在這個其他例如:

try: 
    a=12+"xxx" 
except ValueError: 
    # not trapped 

這裏,異常是不是被困(TypeErrorValueError和不繼承)

您通常使用特定的例外陷阱唯一有可能的那些發生時(最好的例子是IOError當處理文件),並保持其餘未處理。捕獲所有異常的危險是獲得一段不會崩潰的代碼,但什麼也不做。

(編輯答案以迴應你的編輯:)當你引發一個異常時:你正在創建一個Exception的實例,這個實例將被未來的except ValueError:語句過濾掉。該消息是不同的,因爲異常的表示(打印時)包括異常類名稱。

+0

要評估這個答案:你也可以一次捕獲多個不同的異常,並以不同的方式處理它們,請參閱https://docs.python.org/3.5/tutorial/errors.html(搜索除OSError之外的錯誤: '找到我指的例子)。 –

+0

@ Jean-FrançoisFabre 謝謝你的回答,我明白了。如果我不是除ValueError或Exception之外的東西,但是提高它呢?請在我的問題編輯。 –

0

你說的,ValueError是一個特定的異常。一個簡短的例子:

try: 
    print int("hello world") 
except ValueError: 
    print "A short description for ValueError" 

如果用int替換「hello world」,print int(42),你不會引發異常。

你可以看到doc about exceptions here