Является ли регистрация исключения в коде базового класса Исключения хорошим подходом к проектированию?
Некоторые друзья только что завершили реализацию приложения, и они используют пользовательские исключения. что привлекло мое внимание, так это то, что при возникновении пользовательского исключения они регистрировали исключение в коде реализованного базового класса исключений. так что мой вопрос будет это хороший подход к дизайну? я думаю, что помощник регистрации является более удобным
public class BaseCustomException: System.Exception
{
public BaseCustomException()
{
TightlyCoupledClass.Log(this);
}
}
5 ответов
Я понимаю, что они думают о том, чтобы поставить это на место, чтобы они могли гарантировать, что ведение журнала происходит всякий раз, когда выдается исключение CustomException; однако, это определенно вонючий код.
Исключение следует использовать только для исключений, а код, выполняющий код, который может вызвать создание исключения CustomException, должен иметь возможность решать, что делать с этим исключением, а также регистрировать его или нет, поскольку ведение журнала должно быть конкретным к сценарию, в котором это было вызвано.
Дополнительное замечание: пользовательские исключения должны наследоваться от ApplicationException в качестве корневого, чтобы вы могли определить, является ли исключение настраиваемым для ваших бизнес-библиотек или от самой.NET Framework.
- Исправление-- Я только что нашел этот пост, который я не знал о том, что по сути делает использование ApplicationException бесполезным.
Нет, это ужасный подход ИМО. Причина в том, что предполагается, что каждое создаваемое исключение будет выброшено, что, безусловно, не так.
Поскольку исключения, как правило, доступны только для чтения, существуют реализации, в которых одно исключение будет создано для конкретной ситуации и, при необходимости, будет переброшено (CLR устанавливает StackTrace при создании исключения, а не при его создании).
Суть в том, что это не распространено, но возможно, что исключения не создаются при создании, и вы не должны делать предположения на основании этого.
Ведение журнала в конструкторе просто противно. Как еще код, который пытался выполнить операцию, должен создать значимое сообщение, которое может включать исключение? Роль исключения заключается в том, чтобы представлять проблему, а не регистрировать сообщение. Некоторый другой код должен позаботиться об этом, чтобы каждая часть, которая может перехватить это конкретное исключение, могла делать то, что они хотят, что может включать или не включать регистрацию исключения.
В случае вашего журнала внутри конструктора, если исключение было упаковано и переброшено для повторной регистрации, исключение будет зарегистрировано дважды, что глупо.
catch ( CustomException exception ){
Logger.error( "Really useful message", exception );
}
Я так не думаю. Я бы установил глобальный обработчик исключений, который записывал бы исключение (и другие данные) в журнал. Таким образом, вы пишете только уловленные исключения.
Это решение слишком тесно связано и не настраивается. Я бы порекомендовал использовать более надежную среду обработки исключений, например, блок приложения для обработки исключений в Enterprise Library.