【发布时间】:2011-04-23 18:48:18
【问题描述】:
我想使用 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);
}
现在,在 LogException 方法中,我可以看到调用堆栈告诉我 DoSomething() 调用了 TrySomething(),这引发了异常,但我看不到调用堆栈显示 Page_Load() 调用了 DoSomething()。我希望能够看到完整的调用堆栈。
Ex.StackTrace 在 LogException 方法中的示例:
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
我可以从 System.Diagnostics.StackTrace() 获取完整的调用堆栈,例如:
at WebApplication1._Default.LogException(Exception ex)
at WebApplication1._Default.DoSomething()
at WebApplication1._Default.Page_Load(Object sender, EventArgs e)
[snip]
(我可以通过遍历 StackTrace 的每一帧来获取行号和源文件详细信息)
但是我如何将它注入到异常中或使用此调用堆栈详细信息引发新异常?有没有一种优雅的方式来做到这一点?我错过了一些非常明显的东西吗?!
【问题讨论】:
-
查看这些相关问题的答案,以便更好地理解为什么您没有获得完整的调用堆栈:stackoverflow.com/a/6094700/945456 和 stackoverflow.com/a/24297684/945456
标签: c# error-handling elmah callstack