Conozco dos enfoques para el manejo de excepciones, echemos un vistazo a ellos.Manejo de excepciones: contrato vs enfoque excepcional
Enfoque de contrato.
Cuando un método no hace lo que dice que hará en el encabezado del método, generará una excepción. Por lo tanto, el método "promete" que hará la operación, y si falla por alguna razón, arrojará una excepción.
Enfoque excepcional.
Solo arroje excepciones cuando ocurra algo verdaderamente extraño. No debe usar excepciones cuando puede resolver la situación con flujo de control normal (sentencias If). No utiliza Excepciones para el flujo de control, como podría hacer en el enfoque por contrato.
Permite utilizar ambos métodos en diferentes casos:
Tenemos una clase de cliente que tiene un método llamado OrderProduct.
enfoque de contrato:
class Customer
{
public void OrderProduct(Product product)
{
if((m_credit - product.Price) < 0)
throw new NoCreditException("Not enough credit!");
// do stuff
}
}
enfoque excepcional:
class Customer
{
public bool OrderProduct(Product product)
{
if((m_credit - product.Price) < 0)
return false;
// do stuff
return true;
}
}
if !(customer.OrderProduct(product))
Console.WriteLine("Not enough credit!");
else
// go on with your life
Aquí prefiero el enfoque excepcional, ya que no es realmente excepcional de que un cliente no tiene dinero suponiendo que no ganó la lotería .
Pero aquí hay una situación en la que me equivoco en el estilo del contrato.
excepcional:
class CarController
{
// returns null if car creation failed.
public Car CreateCar(string model)
{
// something went wrong, wrong model
return null;
}
}
Cuando llamo a un método llamado CreateCar, me da la Wel esperan una instancia de coches en lugar de algún puntero nulo pésimo, que puede devastar mi código en ejecución de una docena de líneas más adelante. Por lo tanto, prefiero contratar a este:
class CarController
{
public Car CreateCar(string model)
{
// something went wrong, wrong model
throw new CarModelNotKnownException("Model unkown");
return new Car();
}
}
¿Qué estilo usas? ¿Cuál crees que es el mejor enfoque general para las Excepciones?
1 para su ejemplo de devolver un nulo o un resultado -1. En lugar de hacer que el código sea más claro, el retorno nulo o -1 obliga al escritor del método de invocación a saber cómo el método invocado elige informar un resultado no estándar. La excepción es un enfoque de contrato más limpio en el que el invocador puede tratar el invocado como una caja negra (posiblemente) cambiante. Todo el invocador tiene que saber que tendrá que manejar una excepción, no es que sea un nulo hoy y un Integer.MIN_VALUE mañana. – rajah9