如何记录具有完整调用堆栈的异常?

Ale*_*lex 4 c# error-handling callstack elmah

我想使用ELMAH记录一个异常(不将其一直抛出到调用堆栈中),并且它记录整个调用堆栈。

示例代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        DoSomething();
    }

    private void DoSomething()
    {
        try { TrySomething(); }
        catch (Exception ex) { LogException(ex); }
    }

    private void TrySomething()
    {
        throw new NotImplementedException();
    }

    public static void LogException(Exception ex)
    {
        var currentStack = new System.Diagnostics.StackTrace(true);
        Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
    }
Run Code Online (Sandbox Code Playgroud)

现在,在LogException方法中,我可以看到调用堆栈告诉我名为TrySomething()的DoSomething(),并且引发了异常,但是我看不到调用堆栈显示了称为DoSomething()的Page_Load()。我希望能够看到完整的调用堆栈。

LogException方法内部的ex.StackTrace的示例:

at WebApplication1._Default.TrySomething() in C:\Projects\test\GeneralTests\WebApplication1\Default.aspx.cs:line 26
at WebApplication1._Default.DoSomething() in C:\Projects\test\GeneralTests\WebApplication1\Default.aspx.cs:line 20
Run Code Online (Sandbox Code Playgroud)

我可以从System.Diagnostics.StackTrace()获取完整的调用堆栈,例如:

at WebApplication1._Default.LogException(Exception ex)
at WebApplication1._Default.DoSomething()
at WebApplication1._Default.Page_Load(Object sender, EventArgs e)
[snip]
Run Code Online (Sandbox Code Playgroud)

(我可以通过遍历StackTrace的每一帧来获取行号和源文件详细信息)

但是,如何使用此调用堆栈详细信息将此注入异常或引发新异常?有没有一种优雅的方法可以做到这一点?我错过了真正明显的东西吗?

Kin*_*tes 5

您可以执行以下操作以在发生错误时获取完整堆栈:

var currentStack = new System.Diagnostics.StackTrace(true);
return currentStack.ToString();
Run Code Online (Sandbox Code Playgroud)


cjk*_*cjk 2

当应用程序在没有调试标志的情况下编译时,堆栈不一定会在执行中保留。你只能通过在每个方法中添加try/catch来保证每一项都被记录下来。