2010-03-19 8 views
31

Far als Best Practices sind besorgt, was besser ist:ArgumentException oder ArgumentNullException für String-Parameter?

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

    // do other stuff 
} 

oder

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 
} 

Die zweite Version scheint präziser, aber auch umständlicher als die erste. Ich gehe normalerweise mit # 1, aber ich dachte, ich würde prüfen, ob es ein Argument für # 2 gibt.

+0

[Mögliches Duplikat] (http://stackoverflow.com/questions/1355957/should-i-throw-argumentnullexception-if-a-string-is-blank)? Dort schlagen sie auch eine andere Option vor: eine benutzerdefinierte 'StringNullOrEmptyException'. –

Antwort

32

Ich würde sagen, der zweite Weg ist in der Tat genauer - ja, es ist mühsamer, aber Sie können es immer in eine Methode wickeln, um zu vermeiden, es ständig zu tun. Es könnte sogar eine Erweiterung Methode:

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); 
    } 
} 

Eine andere Form, das potentiell nützlich ist, ist eine, die das Original-String zurück, wenn alles in Ordnung ist.

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

Eine weitere Option Code Contracts als Alternative zu prüfen, ist mit Ihren eigenen Ausnahmen zu werfen: Man könnte so etwas schreiben.

5

Ich würde vorschlagen, die erste zu verwenden. Wenn Ihre Methode keine Null oder leere Zeichenfolge erwartet, spielt es keine Rolle, ob null oder leer übergeben wurde - wichtig zu melden und Fehler und das ist was die erste Variante tut.

+0

"Wenn Ihre Methode keine Null oder leere Zeichenfolge erwartet, spielt es keine Rolle, ob null oder leer übergeben wurde" +1, da dies ziemlich genau das ist, was ich dachte. – heisenberg

+2

Ich stimme dieser Antwort zu, obwohl @ JonSkeet's Antwort präziser ist, pragmatisch, das Werfen von 'ArgumentNullException' oder' ArgumentException' macht keinen großen Unterschied zur Perspektive des Aufrufers. Das Übergeben von 'ArgumentNullException' gibt Ihnen keine weiteren Informationen als 'ArgumentException' in Bezug darauf, was zum Beheben des Problems erforderlich ist. – Matthew

0

Eine andere Möglichkeit ist ArgumentOutOfRange Ausnahme:

Die Ausnahme, die ausgelöst wird, wenn der Wert eines Arguments außerhalb des zulässigen Wertebereichs ist, wie durch die aufgerufene Methode definiert.

Verwandte Themen