【问题标题】:Exception handling with Elmah使用 Elmah 处理异常
【发布时间】:2011-12-05 12:10:05
【问题描述】:

我用 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 中记录一条消息?

【问题讨论】:

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


    【解决方案1】:

    您应该努力让 ELMAH 自动为您记录错误,而不是使用 Elmah 的 ErrorSignal 类手动记录错误,这会在引发应用程序的 Error 事件时发生。

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

    简而言之,try...catch 块仅应谨慎使用,例如在您可以从错误中恢复或错误是“次要”错误且不应停止工作流的情况下。但是大多数错误都是真正的阻碍,没有优雅的解决方法。对于大多数人来说,您希望让错误渗透到 ASP.NET 运行时,ELMAH 将在其中自动记录错误,用户将看到错误页面,提醒他们发生了错误。

    查看我的这篇文章:Exception Handling Advice for ASP.NET Web Applications

    【讨论】:

    • 错误日志记录用于需要返回 xml 错误消息的 Web 服务,这就是我不在主循环中重新抛出异常的原因。
    • @chobo:我重新标记了您的问题以更准确地反映您的问题。
    • 在这种情况下 chobo,在 web 方法中,我会将错误响应字符串设置为 Exception.Message,使用 Elmah 记录异常(我个人使用 Exception 上的扩展方法来执行此操作),然后吞下异常。除了重新投掷之外,您所做的大致是什么。
    【解决方案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 方法在这段代码中并不那么重要,我的意思是,如果它有任何错误并且我不想将它们显示给用户,我可以留下它。重要的部分是他/她的个人资料已更新,并且用户通过查看个人资料页面就知道了。

    所以我相信代码中的某些地方可能会不断失败,我希望收到有关它们的通知,但我不想分解整个操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2012-04-13
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      相关资源
      最近更新 更多