#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 не так важен в этом коде, я имею в виду, я могу оставить его, если в нем есть какие-либо ошибки, и я не хочу показывать их пользователю. Важной частью является то, что его / ее профиль обновляется, и пользователь знает об этом, просматривая страницу профиля.
Итак, я считаю, что в коде есть места, которые могут постоянно выходить из строя, я хотел бы получать уведомления о них, но я не хочу прерывать все действие.