在进行异常日志调查时,我在使用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;
,但我没有。
我使用相同的简单代码在两台远程计算机上检查此行为,但得到了不同的结果。第一个按预期工作(原始和重新抛出异常的调用堆栈相同)。第二个显示完全不同的调用堆栈以重新引发异常,因此没有机会获得原始堆栈跟踪。
以前有人遇到过这个问题吗?
主要问题是重新抛出异常时如何保留原始调用堆栈?
先感谢您!