ネット上、特に 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 と同じ結果
SUMUP : すべての回答が素晴らしかったです。ありがとうございます。
その理由は、64 ビット JITter による効果的なインライン化です。
答えを 1 つだけ選択する必要がありましたが、LukeHの答えを選択した理由は次のとおりです。
彼は、インライン化の問題と、それが私の 64 ビット アーキテクチャに関連している可能性があるという事実を推測しました。
彼は、この動作を回避する最も簡単な方法である NoInlining フラグを提供しました。
しかし、この問題は別の問題を引き起こします。この動作はすべての .Net 仕様 (CLR 仕様と C# プログラミング言語仕様) に準拠していますか?
UPDATE : この最適化は、次のように準拠しているようです: Throw VS rethrow : same result? (ありがとう0xA3 )
よろしくお願いします。