2010-03-19 10 views
31

Lejano como las mejores prácticas están preocupados, que es mejor:ArgumentException o ArgumentNullException para los parámetros de cadena?

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

    // do other stuff 
} 

o

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 
} 

La segunda versión parece más preciso, pero también más complicado que el primero. Usualmente voy con el n. ° 1, pero pensé que verificaría si hay un argumento para el n. ° 2.

+0

[Posible duplicar] (http://stackoverflow.com/questions/1355957/should-i-throw-argumentnullexception-if-a-string-is-blank)? Allí también sugieren otra opción: una 'StringNullOrEmptyException' personalizada. –

Respuesta

32

Diría que la segunda manera es más precisa, sí, es más engorrosa, pero siempre puede envolverla en un método para evitar tener que hacerlo todo el tiempo. Incluso podría ser un método de extensión:

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

Otra forma que es potencialmente útil es uno que devuelve la cadena original si todo está bien. Se podría escribir algo como esto:

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

Otra opción a considerar es el uso de Code Contracts como una alternativa a lanzar sus propias excepciones.

5

Sugeriría utilizar el primero. Si su método no espera una cadena nula o vacía, realmente no importa si se pasó nulo o vacío: importante informar y error, y eso es lo que hace la primera variante.

+0

"Si su método no espera una cadena nula o vacía, realmente no importa si se pasó nulo o vacío" +1 ya que esto es más o menos exactamente lo que estaba pensando. – heisenberg

+2

Estoy de acuerdo con esta respuesta, aunque la respuesta de @JonSkeet es más precisa, pragmáticamente, arrojar ya sea 'ArgumentNullException' o' ArgumentException' no hace una gran diferencia desde la perspectiva de la persona que llama. Pasar 'ArgumentNullException' no le da más información que' ArgumentException' en términos de lo que se requiere para solucionar el problema. – Matthew

0

Otra posibilidad es ArgumentOutOfRange excepción:

La excepción que se produce cuando el valor de un argumento está fuera del rango permisible de valores tal como se define por el método invocado.

Cuestiones relacionadas