2010-06-04 24 views
26

Al diseñar sus bibliotecas de clase, Cuando crea un método, ¿cuándo decide lanzar una excepción o devolver un booleano?Cuándo devolver bool, lanzar una excepción y qué excepción arrojar

Por ejemplo.

public class MathHelper 
{ 
    public int Divide(int x, int y) 
    { 
     if(y == 0) 
     { 
      throw new DivideByZeroException("Cannot Divide by Zero"); 
     } 
     return x/y;  
    } 
} 

Este es un caso simple, pero luego comienza a crear métodos más complejos.

¿Cuál prefieres?

public void Parse(TextReader reader, string delimeter) 
{ 
    if(reader == null) 
    { 
     throw new ArgumentNullException("The reader cannot be null"); 
    } 
    if(String.IsNullOrEmpty(delimeter)) 
    { 
     throw new ArgumentNullException("The delimeter cannot be null"); 
    } 
} 

public bool Parse(TextReader reader, string delimeter) 
{ 
    if(reader == null) 
    { 
     logger.Error("Parse failed with null reader"); 
     return false; 
    } 
    if(String.IsNullOrEmpty(delimeter)) 
    { 
     logger.Error("Parse failed with null delimeter"); 
     return false; 
    } 
} 

Respuesta

29
  • Las excepciones son por lo general el camino a seguir para las cosas que el fallo no se espera como una opción.

  • Los valores de retorno booleanos son el camino a seguir para las cosas en las que el fallo puede ser un resultado esperado a veces.

Por lo tanto, en sus ejemplos yo diría que vaya con excepciones.

6

documentación de Java tiene algo que decir acerca de la forma estándar para comprobar las condiciones previas:

https://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#preconditions

Es decir, lanzar una excepción si es público, y el uso afirmar si es privado.

+0

Me gusta mucho esta respuesta, porque si la usa solo para sus bibliotecas internas, lanzar una excepción es costoso. –

+0

el enlace dado a los documentos está roto. – chammu

+0

@chammu Normalmente puedo acceder a él. – KnorxThieus

1

Me gusta la forma en que C# hace lo que pregunta en su ejemplo. Puede obtener un método (int.Parse) que devuelve un número entero o lo arroja por error. También tiene un método (int.TryParse) que rellena un argumento proporcionado por referencia con el valor entero y devuelve un código de estado booleano. De esta manera, si quiere para obtener una excepción, lo hace. Si quiere manejar un error en línea usando un condicional, esa también es una opción.

0

Mientras respuesta aceptada es un buen consejo general, hay algunos casos que prefiero (comprobado) excepciones, incluso cuando el método booleano califica:

  • Diferentes tipos de fallos (esperados) que requieren un tratamiento diferente. Las alternativas son códigos de estado int que requerirían constantes apropiadas y enum de códigos de estado, que podrían ser un poco mejores, pero aún así necesitan una verificación explícita.

  • Excepción propagación. En ocasiones, detecta fallas en la capa del modelo, pero solo puede manejarlas en la vista, que está muy arriba en la cadena. Por lo tanto, en lugar de hacer que todas las funciones devuelvan booleano y propaguen el valor de retorno, use el comportamiento predeterminado de excepciones y péguelos en la capa superior.

Cuestiones relacionadas