Я знаю два подхода к обработке исключений, давайте посмотрим на них.Обработка исключений: Договор против Исключительный подход
Подход к контракту.
Когда метод не выполняет то, что он говорит, что он будет делать в заголовке метода, он выдает исключение. Таким образом, метод «обещает», что он выполнит операцию, и если он по какой-то причине сработает, он выдаст исключение.
Исключительный подход.
Только бросайте исключения, когда происходит что-то действительно странное. Вы не должны использовать исключения, когда можете разрешить ситуацию с помощью обычного потока управления (операторы if). Вы не используете Исключения для потока управления, как вы могли бы в подходе к контракту.
Позволяет использовать оба подхода в различных случаях:
У нас есть класс Customer, который имеет метод, называемый OrderProduct.
контрактный подход:
class Customer
{
public void OrderProduct(Product product)
{
if((m_credit - product.Price) < 0)
throw new NoCreditException("Not enough credit!");
// do stuff
}
}
исключительный подход:
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
Здесь я предпочитаю исключительный подход, как это на самом деле не Исключительный, что клиент не имеет денег, предполагая, что он не выиграл в лотерею ,
Но вот ситуация, когда я ошибаюсь в стиле контракта.
Исключительный:
class CarController
{
// returns null if car creation failed.
public Car CreateCar(string model)
{
// something went wrong, wrong model
return null;
}
}
Когда я вызываю метод, называемый CreateCar, я чертовски вэй ожидать экземпляр автомобиля, а не какой-то паршивый указатель NULL, который может опустошить мой код бега десяток строк позже. Таким образом, я предпочитаю контракт с этим:
class CarController
{
public Car CreateCar(string model)
{
// something went wrong, wrong model
throw new CarModelNotKnownException("Model unkown");
return new Car();
}
}
Какой стиль вы используете? Как вы думаете, лучший ли общий подход к Исключениям?
+1 для вашего примера возврата нулевого или -1 результата. Вместо того, чтобы сделать код более четким, нулевой или -1 возврат заставляет писателя вызывающего метода знать, как вызываемый метод решает сообщить нестандартный результат. Исключением является более чистый, контрактный подход, при котором invoker может обрабатывать вызываемый как (возможно) меняющийся черный ящик. Все invoker должно знать, что ему придется обрабатывать исключение, а не то, что сегодня это null, а Integer.MIN_VALUE - завтра. – rajah9 2013-10-01 17:22:49