2010-03-19 57 views
31

僅就最佳實踐者來說,這是更好的:對於字符串參數,ArgumentException或ArgumentNullException?

public void SomeMethod(string str) 
{ 
    if(string.IsNullOrEmpty(str)) 
    { 
     throw new ArgumentException("str cannot be null or empty."); 
    } 

    // do other stuff 
} 

public void SomeMethod(string str) 
{ 
    if(str == null) 
    { 
     throw new ArgumentNullException("str"); 
    } 

    if(str == string.Empty) 
    { 
     throw new ArgumentException("str cannot be empty."); 
    } 

    // do other stuff 
} 

第二個版本似乎更精確,也比第一個更繁瑣。我通常會和#1一起去,但是我想知道是否有爭議#2。

+0

[可能的重複](http://stackoverflow.com/questions/1355957/should-i-throw-argumentnullexception-if-a-string-is-blank)?在那裏他們還提出了另一個選擇:自定義的'StringNullOrEmptyException'。 – 2013-01-25 16:47:44

回答

32

我想說的第二種方法確實更精確 - 是的,它更麻煩,但你總是可以用一種方法來包裝它,以避免必須一直這樣做。它甚至可以是擴展方法:

str.ThrowIfNullOrEmpty("str"); 


public static void ThrowIfNullOrEmpty(this string value, string name) 
{ 
    if (value == null) 
    { 
     throw new ArgumentNullException(name); 
    } 
    if (value == "") 
    { 
     throw new ArgumentException("Argument must not be the empty string.", 
            name); 
    } 
} 

另一種潛在有用的形式是,如果一切正常,它將返回原始字符串。你可以寫這樣的事情:

public Person(string name) 
{ 
    this.name = name.CheckNotEmpty(); 
} 

另一種選擇是使用Code Contracts作爲替代拋出自己的異常來考慮。

5

我會建議使用第一個。如果你的方法不期望null或者空字符串,那麼如果null或empty被傳遞,那真的沒關係 - 對於報告和錯誤很重要,這就是1st變體所做的。

+0

「如果你的方法不期望null或者空字符串,那麼如果null或者空被傳遞」+1,這真的沒有關係,因爲這幾乎就是我所想的。 – heisenberg 2010-03-19 21:02:04

+2

我同意這個答案,儘管@ JonSkeet的回答更精確,務實,拋出'ArgumentNullException'或者'ArgumentException'並不會對調用者的角度產生巨大影響。傳遞'ArgumentNullException'在解決問題所需的條件方面不會給您提供比ArgumentException更多的信息。 – Matthew 2013-08-13 22:03:32

0

另一種可能性是ArgumentOutOfRange例外:

當參數的值是由所調用的方法所定義的值的允許範圍之外時引發的異常。