Обработка исключений с помощью Elmah - PullRequest
1 голос
/ 11 октября 2011

Я регистрирую исключения в 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, должен ли я выполнить тест для этого (если null ...) и записать сообщение в Elmah?

Ответы [ 2 ]

9 голосов
/ 11 октября 2011

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

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

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

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

2 голосов
/ 11 октября 2011

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

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

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

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

...