Я читаю книгу по разработке корпоративных приложений во время работы над проектом MVC 3. В настоящее время я решаю, как обрабатывать исключения. Раньше я позволял исключению пузыриться в стеке, а затем обрабатывал его на самом высоком уровне.
В книге предлагается создать специальный класс в доменной модели и вернуть его. Э.Г.
public sealed class MissingCustomer: Customer
{
}
// On method failure return new MissingCustomer();
Я вижу идею, но я изо всех сил пытаюсь обосновать необходимость в этом. Мудрый код Я согласен, что гораздо лучше вернуть нового пропавшего клиента, а не выдавать исключение.
Что вы думаете об этом подходе и сталкивались ли вы со сценарием, в котором это имело существенное значение?
Если мы предполагаем, что клиент всегда должен существовать, то имеет смысл выбросить исключение, говорящее: «Эй, клиент должен существовать всегда, и по какой-то причине его нет, поэтому я собираюсь уведомить пользователя, сказав, что что-то исключительное получилось". С другой стороны, я могу предположить, что клиент может быть удален другим человеком, поэтому мне нужно с этим справиться.
В любом случае я думаю, что нам понадобится класс MissingCustomer или MissingCustomerException, так как клиент - это очень распространенная сущность, которая используется во всей системе. Если модель представления ожидает клиента, а мы возвращаем MissingCustomer - это нормально, так как наследование заставит это работать.
Например, у меня есть метод действия, который возвращает OrderViewModel. Этот метод действия требует ссылки на клиента.
Customer customer = CustomerRepository.Find(10);
if(customer == null)
{
return new MissingCustomer();
}
Это упадет, потому что метод действия вернет модель представления типа OrderViewModel, поэтому теперь я больше склонен к использованию исключения вместо объекта MissingCustomer.
Редактировать
Кроме того, объект типа MissingCustomer будет наследовать свойства от типа Customer. Эти свойства не нужны, так как единственное, что мы хотим сделать, это уведомить пользователей о том, что клиент не может быть найден.
Спасибо