Является ли регистрация исключения в коде базового класса Исключения хорошим подходом к проектированию? - PullRequest
1 голос
/ 31 января 2009

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

 public class BaseCustomException: System.Exception
{

   public BaseCustomException()
   {
              TightlyCoupledClass.Log(this);
   }

}

Ответы [ 5 ]

3 голосов
/ 31 января 2009

Нет, это ужасный подход ИМО. Причина в том, что предполагается, что каждое создаваемое исключение будет выброшено, что, безусловно, не так.

Поскольку исключения, как правило, предназначены только для чтения, существуют реализации, в которых одно исключение будет создано для конкретной ситуации и перезапущено при необходимости (CLR устанавливает StackTrace при создании исключения, а не при его создании).

Итог, это не распространено, но возможно, что исключения не создаются при создании, и вы не должны делать предположения на основе этого.

2 голосов
/ 31 января 2009

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

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

Дополнительное примечание: пользовательские исключения должны наследоваться от ApplicationException в качестве корневого, чтобы вы могли определить, является ли исключение настраиваемым для ваших бизнес-библиотек или из самой .NET Framework.
--CORRECTION-- Я только что нашел этот пост , о котором я не знал, что по сути делает использование ApplicationException бесполезным.

0 голосов
/ 31 января 2009

Это решение слишком тесно связано и не настраивается. Я бы рекомендовал использовать более надежную среду обработки исключений, например, Блок приложения для обработки исключений Enterprise Library .

0 голосов
/ 31 января 2009

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

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

catch ( CustomException exception ){
Logger.error( "Really useful message", exception );
}
0 голосов
/ 31 января 2009

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

...