参考网上的很多文档,特别是关于 SO,例如:在 C# 中重新抛出异常的正确方法是什么? "throw e;" 之间应该有区别 和“扔;”。
但是,来自:http ://bartdesmet.net/blogs/bart/archive/2006/03/12/3815.aspx ,
这段代码:
using System;
class Ex
{
public static void Main()
{
//
// First test rethrowing the caught exception variable.
//
Console.WriteLine("First test");
try
{
ThrowWithVariable();
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
//
// Second test performing a blind rethrow.
//
Console.WriteLine("Second test");
try
{
ThrowWithoutVariable();
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
}
private static void BadGuy()
{
//
// Some nasty behavior.
//
throw new Exception();
}
private static void ThrowWithVariable()
{
try
{
BadGuy();
}
catch (Exception ex)
{
throw ex;
}
}
private static void ThrowWithoutVariable()
{
try
{
BadGuy();
}
catch
{
throw;
}
}
}
给出以下结果:
$ /cygdrive/c/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe Test.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.
$ ./Test.exe
First test
at Ex.ThrowWithVariable()
at Ex.Main()
Second test
at Ex.ThrowWithoutVariable()
at Ex.Main()
这与博客文章完全矛盾。
使用以下代码获得相同的结果:http: //crazorsharp.blogspot.com/2009/08/rethrowing-exception-without-resetting.html
原始问题:我做错了什么?
更新:与 .Net 3.5 / csc.exe 3.5.30729.4926 的结果相同
总结:你所有的答案都很棒,再次感谢。
所以原因是由于 64 位 JITter 而有效地内联。
我只能选择一个答案,这就是我选择LukeH答案的原因:
他猜到了内联问题,并且可能与我的 64 位架构有关,
他提供了 NoInlining 标志,这是避免这种行为的最简单方法。
然而这个问题现在引发了另一个问题:这种行为是否符合所有 .Net 规范:CLR 规范和 C# 编程语言规范?
更新:这种优化似乎符合:Throw VS rethrow:相同的结果?(感谢0xA3)
在此先感谢您的帮助。