Есть ли стандарт для обработки исключений? Если да, пожалуйста, дайте ссылку - PullRequest
2 голосов
/ 02 апреля 2011

Я занимаюсь разработкой блока кода, написанного предыдущим разработчиком, ему совсем не нравилась обработка исключений!

Интересно, смогу ли я найти какое-либо руководство по обработке исключений вообще.

Например: если предположить, что существует метод, отвечающий за выполнение запроса в базе данных, если он не работает в соединении, то должен ли он вызывать то же исключение для вызывающей стороны? или он должен просто обработать его, зарегистрировать и вернуть false (означает сбой).

Я знаю, что вопрос кажется субъективным, я просто хочу любые ресурсы, рекомендации или стандарты для обработки исключений.

Привет.

Ответы [ 2 ]

5 голосов
/ 02 апреля 2011

Если вы спросите 10 разработчиков, вы, вероятно, получите 10 разных ответов.Общее правило, которым я придерживаюсь, заключается в том, что обработка исключений должна быть стандартизирована и не повторяться в каждом отдельном методе.Я стараюсь стремиться к тому, чтобы исключения обрабатывались один раз для каждого уровня согласованным образом.

Таким образом, в стандартной трехуровневой архитектуре (представление, бизнес, данные) у вас будет стандартный механизм обработки исключений на каждом уровне,и все три из этих механизмов могли бы за кадром вызывать одно и то же ведение журнала / уведомление / и т. д.

Вот ссылка на Рекомендации Microsoft .

3 голосов
/ 02 апреля 2011

Обработка исключений является «проблемой», как и в разделении проблем, и поэтому ее не следует распространять на ваше приложение и смешивать с вашей основной бизнес-логикой.Эта область, скорее всего, будет развиваться не так, как ваша бизнес-логика.

Например, вы упомянули об открытии соединения с базой данных.Вы можете начать с регистрации исключения, но позже вы можете решить, что оно должно автоматически повторить попытку по истечении времени ожидания, или отправить предупреждение, или, возможно, было бы целесообразно реализовать шаблон автоматического выключателя .

Соблюдение принципа единой ответственности и разделения интересов позволяет вам самостоятельно развивать свое поведение при обработке исключений.Рассмотрим этот интерфейс:

public interface IConnectionFactory
{
    IConnection Create();
}

Если вы не выполняете никакой обработки исключений в своей базовой реализации, которая позволяет вам использовать наследование, шаблон декоратора или некоторое средство вашей платформы для добавления дополнительного поведения.

public class RetryOnTimeoutConnectionFactory { ... }
public class CircuitBreakerConnectionFactory { ... }

Другая вещь, которую следует учитывать, это контекст.Вы упомянули, что это веб-сервис.Хорошо, если вы следуете семантике REST, вы, вероятно, перевели бы свои исключения в коды состояния HTTP в зависимости от классификации исключения.Если вы перехватываете свои исключения на низком уровне и молча возвращаете false, тогда вы действительно надеваете на себя наручники.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...