【问题标题】:ELMAH - ErrorSignal.Raise no stack infoELMAH - ErrorSignal.Raise 没有堆栈信息
【发布时间】:2014-09-26 16:50:40
【问题描述】:

我正在捕获一个异常并使用 ELMAH 记录它。

如果我没有捕获异常并让应用程序 YSOD,ELMAH 会记录完整的堆栈跟踪。但是,当我捕获并使用ErrorSignal.Raise(ex) 时,我没有得到堆栈跟踪。

我也试过了,没用:

ErrorSignal.FromCurrentContext().Raise(new System.ApplicationException(exception.ToString(), exception));

什么?

【问题讨论】:

    标签: elmah


    【解决方案1】:

    您正在使用ErrorSignal.Raise 并带有一个未引发的异常,即您刚刚new 出现了。抛出异常时会填充堆栈跟踪,因此未抛出的异常不会有堆栈跟踪。另一方面,ELMAH 将捕获您在此处包装的异常实例——如果您在调试器中查看它,它实际上将包含堆栈跟踪,这与包装异常不同。

    而不是包装在 System.ApplicationException 中(顺便说一下,您最初应该有 inherited from,现在是 considered obsolete by the framework designers),您应该只引发您捕获的原始异常。

    作为一个有趣的旁注:由于堆栈跟踪是在您抛出异常时填充的,因此:

    catch (Exception ex) {
        throw ex;
    }
    

    将销毁原始堆栈跟踪,而

    catch (Exception ex) {
        throw; 
    }
    

    不会(后一位将发出 CIL rethrow 操作码,保留原始堆栈跟踪)。

    【讨论】:

      【解决方案2】:

      这样就可以了:

      ErrorSignal.FromCurrentContext().Raise(
                      new System.ApplicationException(
                          exception.Message + exception.StackTrace, exception));
      

      【讨论】:

      • 让我目瞪口呆。真的。由于我的帖子中概述的原因,我将不得不对此投反对票——您不是在记录具有完整堆栈跟踪的异常,而是在记录具有不同异常堆栈跟踪的异常作为其消息。这可能会产生一个看起来大部分正确的结果,但它绝对只是偶然的,并且基于反模式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 2021-05-13
      • 2017-08-17
      相关资源
      最近更新 更多