Пользовательский класс исключений для оповещения об ошибках и регистрации - PullRequest
1 голос
/ 12 января 2011

В настоящее время я пишу API для некоторых манипуляций с данными, и у меня возник вопрос, на который я не могу ответить сам: D

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

Я прочитал эту статью о том, как расширить исключение в c # Итак, мы идем с моим примером кода:

public class CustomExceptionClass : Exception
{
    /// <summary>
    /// I use custom functionality here everytime this exception occures
    /// </summary>
    /// <param name="errorMessage">error message</param>
    /// <param name="innerEx">Inner exception that cause this exception</param>
    public MyCustomException(string errorMessage, Exception innerEx) : base(errorMessage, innerEx)
    {
        //log exception
        _log.ErrorFormat(errorMessage, innerEx);
        //alert via sms and email
        AlertMailer.SendAlertMessage(errorMessage, innerEx, innerEx.Message);
    }
}

Ответы [ 4 ]

4 голосов
/ 12 января 2011

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

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

void MyApiFunction()
{
    try
    {
        // do data manipulation
    }
    catch(MyCustomException ex)
    {
        _log.ErrorFormat(ex.ErrorMessage, ex.InnerEx);
        AlertMailer.SendAlertMessage(ex.ErrorMessage, ex.InnerEx);
    }
}
1 голос
/ 12 января 2011

Пользовательские исключения должны использоваться для определения различных типов исключений.

  • Исключения из базы данных
  • Исключения из файла io
  • Исключения из веб-служб

Они должны быть очень простыми и содержатьникакой другой логики, кроме присвоения переменных.Зачем?Потому что, если конструктор исключений выдает другое исключение, вам будет трудно его отследить.

Способы, которыми я обрабатываю , следующие исключения:

  1. AOP (Spring.NET)
  2. Специальная попытка / перехват
  3. Глобальный обработчик исключений

В программе

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            try {
                //do something
            } catch(Exception e) {
                //log error
            }
        }
    }
}

Или на веб-сайте

public class ApplicationErrorModule : IHttpModule {

    public void Init(HttpApplication context) {
        context.Error += new EventHandler(context_Error);
    }

    private void context_Error(object sender, EventArgs e) {
        //log error
    }
}
1 голос
/ 12 января 2011

Я бы порекомендовал вам использовать АОП вместо этого. Обработка исключений PostSharp

0 голосов
/ 12 января 2011

Тяжелые процедуры, такие как регистрация и отправка электронной почты, не входят в конструктор исключения.Вместо этого вы должны обработать исключение, используя AOP, как предложено @petro, или в операторе catch.

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