Обработка исключений является «проблемой», как и в разделении проблем, и поэтому ее не следует распространять на ваше приложение и смешивать с вашей основной бизнес-логикой.Эта область, скорее всего, будет развиваться не так, как ваша бизнес-логика.
Например, вы упомянули об открытии соединения с базой данных.Вы можете начать с регистрации исключения, но позже вы можете решить, что оно должно автоматически повторить попытку по истечении времени ожидания, или отправить предупреждение, или, возможно, было бы целесообразно реализовать шаблон автоматического выключателя .
Соблюдение принципа единой ответственности и разделения интересов позволяет вам самостоятельно развивать свое поведение при обработке исключений.Рассмотрим этот интерфейс:
public interface IConnectionFactory
{
IConnection Create();
}
Если вы не выполняете никакой обработки исключений в своей базовой реализации, которая позволяет вам использовать наследование, шаблон декоратора или некоторое средство вашей платформы для добавления дополнительного поведения.
public class RetryOnTimeoutConnectionFactory { ... }
public class CircuitBreakerConnectionFactory { ... }
Другая вещь, которую следует учитывать, это контекст.Вы упомянули, что это веб-сервис.Хорошо, если вы следуете семантике REST, вы, вероятно, перевели бы свои исключения в коды состояния HTTP в зависимости от классификации исключения.Если вы перехватываете свои исключения на низком уровне и молча возвращаете false
, тогда вы действительно надеваете на себя наручники.