throw
会抛出手头的异常而不会改变堆栈跟踪,但在catch块中使用throw ex
会更改堆栈跟踪以显示语句所在位置的异常来源。以下是两个代码块。我希望它们的输出有细微差别,因为其中一个使用了
throw
,另一个使用了throw ex
,但是两者之间的输出相同,并且导致初始异常的实际源代码行在这两种情况下都丢失了,这对我来说似乎很糟糕。我错了吗?
以下是第一个示例,其表现与我的期望相符:
using System;
public class Program
{
public static void Main()
{
try
{
DummyWork();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
private static void DummyWork()
{
try
{
throw new Exception("dummy");
}
catch (Exception ex)
{
Console.WriteLine(ex);
throw ex; // I would expect to lose the information about the inciting line 5 above this one in this case.... and I do.
}
}
}
这个第二个例子的行为与第一个完全相同,但我不期望这样:
using System;
public class Program
{
public static void Main()
{
try
{
DummyWork();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
private static void DummyWork()
{
try
{
throw new Exception("dummy");
}
catch (Exception ex)
{
Console.WriteLine(ex);
throw; // I would NOT expect to lose the information about the inciting line 5 above this one in this case.... But I do. Output is identical.
}
}
}
更新: 一些评论者说他们无法重现这个问题-这是我的dot fiddle(您需要手动编辑它来在两个版本之间来回切换):https://dotnetfiddle.net/Mj7eK5
更新#2:对于一些要求“相同”输出的评论者。以下是第一个示例的输出:
System.Exception: dummy
at Program.DummyWork() in d:\Windows\Temp\xoyupngb.0.cs:line 21
System.Exception: dummy
at Program.DummyWork() in d:\Windows\Temp\xoyupngb.0.cs:line 26
at Program.Main() in d:\Windows\Temp\xoyupngb.0.cs:line 9
以下是第二个示例的输出结果:
System.Exception: dummy
at Program.DummyWork() in d:\Windows\Temp\jy4xgqrf.0.cs:line 21
System.Exception: dummy
at Program.DummyWork() in d:\Windows\Temp\jy4xgqrf.0.cs:line 26
at Program.Main() in d:\Windows\Temp\jy4xgqrf.0.cs:line 9
撇开微不足道的临时文件差异,两种情况下外部catch(第二个)都缺少初始抛出异常的第21行代码。我期望在第一个例子中使用throw ex
而不是在第二个例子中使用throw
。
static void SecondLevelDummy() => throw new Exception("dummy");
并在DummyWork
中的try
块内调用SecondLevelDummy();
。 - 41686d6564 stands w. Palestinethrow ex
会重置堆栈跟踪(因此您的错误将似乎起源于HandleException
)”。在您的情况下,HandleException
是DummyWork
。您看不到区别,因为异常无论如何都来自DummyWork
。 - 41686d6564 stands w. Palestinethrow
情况下确实会吞噬堆栈,原因不明。 - Ed'ka