Страницы

Поиск по вопросам

понедельник, 3 февраля 2020 г.

Что лучше использовать Result или Exception

#c_sharp #исключения #валидация


Есть бизнес класс, который выполняет какую-то единицу работы:

class EmployeeCalculator
{
    public Pay CalculatePay(Employee employee)
    {
        //Do somthing
    }
}


По каким-то причинам выполнение метода CalculatePay может завершиться с ошибкой.
Собственно вопрос: как лучше будет передать ошибку ? Можно сделать какой-нибудь класс
типа:

public class PayResult
{
    public Pay Pay { get; set; }
    public bool IsError { get; set; }
    public string ErrorMessage { get; set; }
}


И возвращать его из метода CalculatePay, а на вызывающей стороне проверять IsError.
Либо из метода CalculatePay бросить исключение, и так же на вызывающей стороне ловить
его. Если бросать исключение то на каком уровне его ловить (предположим что наше приложение
использует MVC) ? На уровне контроллеров и там уже перерабатывать и выдавать сообщения
на UI или это может быть отдельный слой обработки ошибок между контроллером и бизнес
логикой ? 

PS. Буду благодарен любой информации по вопросу (ваши мысли, статьи, книги).
    


Ответы

Ответ 1



Все зависит от причины, по которой не удалось посчитать Pay. Если это действительно исключительная ситуация - например, невалидные данные для расчета - то нужно бросать исключение. Если это ожидаемая ситуация - например, Employee ничего не заработал - то стоит возвращать или Pay с 0 (возможно, как преодпределенный экземпляр Pay.None), или возвращать null - если ваш клиентский код готов этот null обработать.

Ответ 2



Лучше PayResult, если результат не посчитан значит PayResult.Pay = null, если клиенту нужны подробности то пусть смотрит PayResult.ErrorMessage. Исключения нужны когда системный сбой, неправильные аргументы функции когда продолжить работу невозможно, а у вас возврат результата которого можно и не получить - вполне штатная ситуация.

Ответ 3



Если ошибка возникает очень редко (является исключительной ситуацией), то выкидывать исключение. Если ошибка - почти норма, возникает часто, то можно возвращать код ошибки. Распространённый подход - иметь два метода: один выкидывает исключение, другой, с префиксом Try возвращает булево значение, сигналирующее об успешности операции. Например: int.Parse - int.TryParse DateTime.Parse - DateTime.TryParse и другие.

Комментариев нет:

Отправить комментарий