在异常日志调查中,当我使用throw;
重新抛出捕获的异常时,遇到了异常调用堆栈的奇怪行为。
例如
string callstack1, callstack2;
try
{
try
{
// some code throwing exception
}
catch (Exception ex1)
{
// deal with exception
callstack1 = ex1.StackTrace;
throw;
}
}
catch (Exception ex2)
{
// handle exception
callstack2 = ex2.StackTrace;
}
在此示例中,我期望callstack1
和callstack2
变量具有相同的值。但是保存的调用栈信息将我指向了throw;
块中的catch
指令。
如果我使用throw ex1;
,则可能是预期的行为,但我不这样做。
我使用相同的简单代码在两台远程计算机上检查此行为,但是得到了不同结果。 first one可以正常工作(原始和重新抛出异常的调用堆栈相同)。 second one显示用于重新抛出异常的完全不同的调用堆栈,因此没有机会获得原始堆栈跟踪。
以前有人遇到过这个问题吗?
主要问题是在重新引发异常时如何保留原始调用栈?
提前谢谢!