Обработка исключений с помощью Elmah

#c# #web-services #exception #error-handling #elmah

#c# #веб-сервисы #исключение #обработка ошибок #elmah

Вопрос:

Я регистрирую исключения с помощью Elmah и задавался вопросом, является ли техника, которую я использую, хорошим дизайном?

Прямо сейчас я перехватываю и повторно генерирую исключения, возникающие в различных классах и методах, и регистрирую их в Elmah в основном блоке try-catch программы.

// Основная программа

 try
{
   // Some code that fires off other classes, etc...
   MyTestClass myTestClass = new MyTestClass();
   myTestClass.Execute();   

}
catch(Exception ex)
{
   ErrorSignal.FromCurrentContext().Raise(ex);
}
  

// MyTestClass

     public class MyTestClass
    {
        public object ApiResult { get; set; }


        public string Execute()
        {            
            try
            {
                // execute some code
                // ....
                // set xml message
                ApiResult = "User information xml response";
            }
            catch (Exception ex)
            {
                // set xml message
                ApiResult = "something went wrong xml error response...";

                throw;
            }
        }

    }
  

Было бы лучше регистрировать исключения там, где они происходят? Еще один вопрос, должен ли я регистрировать ошибки, которые я могу обрабатывать, не перехватывая исключения? Например, если что-то равно нулю, должен ли я выполнить тест для этого (если null …) и записать сообщение в Elmah?

Ответ №1:

Вместо того, чтобы вручную регистрировать ошибку с помощью ErrorSignal класса Elmah, вы должны вместо этого стремиться к тому, чтобы ELMAH автоматически регистрировал ошибки для вас, что происходит при Error возникновении события приложения.

В вашем примере есть серьезная проблема с основной программой. А именно, он проглатывает исключения, по крайней мере, для конечного пользователя. Да, исключение регистрируется в ELMAH, но вы скрываете ошибку от пользователя. Конечный пользователь будет думать, что его отправка формы (или что-то еще) прошла без ошибок, когда на самом деле возникла серьезная проблема.

Короче говоря, try...catch блоки следует использовать только экономно, например, в тех случаях, когда вы можете восстановиться после ошибки или когда ошибка является «незначительной» и не должна останавливать рабочий процесс. Но большинство ошибок являются настоящими ограничителями показа и не имеют изящного обходного пути. Для этого большинства вы бы хотели, чтобы ошибка просачивалась до ASP.NET среда выполнения, в которой ELMAH автоматически зарегистрирует это и где пользователь увидит страницу с ошибкой, предупредит их о том, что произошла ошибка.

Ознакомьтесь с этой моей статьей: Рекомендации по обработке исключений для ASP.NET Веб-приложения.

Комментарии:

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

2. @chobo: я переназначил ваш вопрос, чтобы более точно отразить ваш вопрос.

3. В этом случае, чобо, в веб-методе я бы установил строку ответа на ошибку в исключение. Сообщение, зарегистрируйте исключение с помощью Elmah (лично я использую метод расширения для исключения для этого) и проглотите исключение. В целом, что вы делаете, кроме повторного перетаскивания.

Ответ №2:

Я думаю, что следующая ситуация даст вам представление о том, когда использовать ErrorSignal .FromCurrentContext().Raise(например);

 var bo = new CustomerBO();
bo.Update(customer);
try
{
   Email.SendProfileChangedNotification();
}
catch(Exception ex)
{
   ErrorSignal.FromCurrentContext().Raise(ex);
}
Response.Redirect(Constants.ProfilePage);
  

Электронная почта.Метод SendProfileChangedNotification не так важен в этом коде, я имею в виду, я могу оставить его, если в нем есть какие-либо ошибки, и я не хочу показывать их пользователю. Важной частью является то, что его / ее профиль обновляется, и пользователь знает об этом, просматривая страницу профиля.

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