#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 и другие.
Комментариев нет:
Отправить комментарий