使用Elmah进行异常处理

时间:2011-10-11 17:19:31

标签: c# web-services exception error-handling elmah

我与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中记录消息吗?

2 个答案:

答案 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方法在这段代码中并不那么重要,我的意思是,如果它有任何错误,我可以随身携带,我不想向用户展示它们。重要的是,他/她的个人资料已更新,用户通过查看个人资料页面了解它。

所以我相信在代码中可能会经常失败,我希望得到关于它们的通知,但我不想打破整个行动。