我与Elmah记录异常并且想知道我使用的技术是否是好的设计?
现在我抓住并重新抛出各种类和方法中出现的异常,并将它们记录到程序的主try-catch块中的Elmah。
//主程序
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中记录消息吗?
答案 0 :(得分:9)
不是使用Elmah的ErrorSignal
类手动记录错误,而是应该让ELMAH自动记录错误,这会在应用程序的Error
事件被引发时发生。
在您的示例中,主程序存在严重问题。也就是说,至少对于最终用户来说,它是吞咽异常。是的,异常是在ELMAH中记录,但是您正在隐藏用户的错误。最终用户会认为她的表单提交(或其他)没有错误,但实际上存在严重问题。
简而言之,try...catch
块只应谨慎使用,例如在您可以从错误中恢复或错误是“次要”的情况下,并且不应该停止工作流程。但是大多数错误都是真正的阻止,并没有优雅的解决方法。对于大多数人来说,你希望让错误渗透到ASP.NET运行时,ELMAH会自动将其记录下来,并且用户将看到错误页面的位置,并提醒他们发生错误这一事实。
查看我的这篇文章:Exception Handling Advice for ASP.NET Web Applications。
答案 1 :(得分:2)
我认为以下情况会让您了解何时使用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方法在这段代码中并不那么重要,我的意思是,如果它有任何错误,我可以随身携带,我不想向用户展示它们。重要的是,他/她的个人资料已更新,用户通过查看个人资料页面了解它。
所以我相信在代码中可能会经常失败,我希望得到关于它们的通知,但我不想打破整个行动。