1

在进行异常日志调查时,我在使用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;
}

在此示例中,我期望callstack1callstack2变量具有相同的值。但是保存的调用堆栈信息将我指向块throw;内的指令。catch如果我使用它可能是预期的行为throw ex1;,但我没有。

我使用相同的简单代码在两台远程计算机上检查此行为,但得到了不同的结果。第一个按预期工作(原始和重新抛出异常的调用堆栈相同)。第二显示完全不同的调用堆栈以重新引发异常,因此没有机会获得原始堆栈跟踪。

以前有人遇到过这个问题吗?

主要问题是重新抛出异常时如何保留原始调用堆栈?

先感谢您!

4

0 回答 0