2010-01-02 45 views
7

Possible Duplicate:
Which exception should I raise on bad/illegal argument combinations in Python?python:我應該使用ValueError還是創建自己的子類來處理無效的字符串?

我已經看過python的內置異常,唯一看起來接近的東西是ValueError。

從Python文檔:

exception ValueError: 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異常的子類,像InvalidFormatException?

(我的具體情況是,如果一個羅馬數字的字符串格式不正確,但也有許多其他適用的情況下)。

編輯:好像ValueError異常是正確的選擇,現在的問題是,是否使用ValueError直接或子類化它。

回答

7

ValueError是一個很好的匹配你的情況。請記住,您可以指定一個有用的消息作爲參數,讓您將其與其他類型的ValueError區分開來。

但是,我不會通過定義一個子類來使代碼更復雜,除非我有一個很好的理由想要捕獲特定的錯誤,但避免捕獲任何其他的ValueErrors。許多應用程序有幾十個「特殊的」錯誤條件,但是如果他們也定義了每個案例的子類,那麼代碼將很快變得無法維護,任何嘗試使用這些例程的人都會因意外的新例外而不斷地感到驚訝。

+0

這是最好的答案(請記住,您可以提供一些特定的文本,例外情況,並將其與trackback一起交付);然而,換句話說,推動我創建一個子類 - 一個非常低的,但仍然存在的障礙並不需要很多理由。 – 2010-01-03 00:19:42

+0

@Roger,我同意,關於這個消息的好處。我編輯過提及這個有用的想法。 – 2010-01-03 01:32:07

0

是的。 ;-) ValueError確實聽起來像最適用的內置的,並與你的一個子類似乎是儘可能做到最好。這也是f.i. '%q' % 1會提高。

4

ValueError異常似乎是合乎邏輯:

In [1]: int('abc') 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 

<ipython console> in <module>() 

ValueError: invalid literal for int() with base 10: 'abc' 
0

我也支持ValueError異常這種情況。我的2美分。

2

我投票支持創建一個唯一的子類InvalidFormatException。

ValueError雖然爲真,但含糊不清。

InvalidFormatException異常更具體,直接與您的問題掛鉤。

用戶可能會結束他們正在做的事情,可能會產生任何錯誤。他們可能會轉換羅馬數字,然後做一些數學。他們可能需要區分ValueError和InvalidFormatException。

+0

是的,我總是會提出一個自定義的特定例外......它不會受到傷害,但它可能會在以後幫助您。 – 2010-01-02 17:05:02

2

實際上,它取決於您是否想要(或需要)該特定異常可以獨立於其他ValueError,可能在調用您的代碼時發生。這也取決於你是否是你的代碼的唯一消費者,或者它是用於其他人使用的;在後一種情況下,如果您定義一些可以檢查的高級別特定於庫的異常,這些人可能會對這些人有所幫助。

相關問題