C#。重新引发异常时的奇怪行为

时间:2019-01-12 17:04:19

标签: c# exception callstack rethrow

在异常日志调查中,当我使用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;,则可能是预期的行为,但我不这样做。

我使用相同的简单代码在两台远程计算机上检查此行为,但是得到了不同结果。 first one可以正常工作(原始和重新抛出异常的调用堆栈相同)。 second one显示用于重新抛出异常的完全不同的调用堆栈,因此没有机会获得原始堆栈跟踪。

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

主要问题是在重新引发异常时如何保留原始调用栈?

提前谢谢!

0 个答案:

没有答案