design - online - Cuándo volver bool, lanzar una excepción y qué excepción lanzar
graphic design online course (4)
Al diseñar sus bibliotecas de clase, cuando crea un método, ¿cuándo decide lanzar una excepción o devolver un booleano?
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 comienzas a crear métodos más complejos.
¿Cual 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;
}
}
La documentación de Java tiene algo que decir sobre la forma estándar de verificar las condiciones previas:
https://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#preconditions
Es decir, genera una excepción si es pública y utiliza assert si es privada.
Me gusta la forma en que C # hace lo que preguntas en tu ejemplo. Puede obtener un método ( int.Parse
) que devuelve un entero, o arroja el 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 obtener una excepción, lo hace. Si quiere manejar un error en línea usando un condicional, esa también es una opción.
Si bien la respuesta aceptada es un buen consejo general, hay algunos casos en los que prefiero (marcado) excepciones incluso cuando el método booleano califica:
Diferentes tipos de fallas (esperadas) que requieren un manejo 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.
Propagación de excepció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.
Las excepciones son generalmente el camino a seguir para las cosas donde no se espera el fracaso como una opción.
Los valores de retorno booleanos son el camino a seguir para las cosas en las que a veces el fracaso puede ser un resultado esperado.
Por lo tanto, en sus ejemplos yo diría que vaya con excepciones.