Elmah的异常处理

本文关键字:异常处理 Elmah | 更新日期: 2023-09-27 18:11:11

我用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;
            }
        }
    }

记录发生的异常会更好吗?另一个问题是,我是否应该记录我可以处理而不会捕获异常的错误?例如,如果某些东西是空的,我应该做一个测试(如果空…),并在Elmah日志消息吗?

Elmah的异常处理

与其使用Elmah的ErrorSignal类手动记录错误,不如让Elmah自动为您记录错误,当应用程序的Error事件被引发时就会发生。

在你的例子中,主程序有一个严重的问题。也就是说,它是吞并异常,至少对最终用户是这样。是的,异常正在登录ELMAH,但是您对用户隐藏了错误。最终用户会认为她的表单提交(或其他)没有错误,而实际上存在一个严重的问题。

简而言之,try...catch块只应该谨慎使用,例如在您可以从错误中恢复的情况下,或者当错误是一个"小"错误并且不应该停止工作流时。但大多数错误都是真正的阻碍,没有优雅的解决方案。对于大多数情况,您可能希望让错误渗透到ASP中。. NET运行时,ELMAH将自动记录它,并且用户将看到一个错误页面,提醒他们发生错误的事实。

查看我的这篇文章:ASP的异常处理建议。. NET Web应用。

我认为下面的情况会给你一个想法,什么时候使用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);

电子邮件。SendProfileChangedNotification方法在这段代码中不是很重要,我的意思是,如果它有任何错误,我可以离开它,我不想向用户显示它们。重要的是,他/她的个人资料被更新了,用户通过查看个人资料页面知道了这一点。

所以我相信代码中有可能经常失败的地方,我希望得到关于它们的通知,但我不想破坏整个操作。