ссылаясь на большое количество документации в сети, в частности, на SO, например: Как правильно вызвать исключение в С#? должна быть разница между "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 эффективно встроен.
Мне пришлось выбрать только один ответ, и вот почему я выбрал ответ LukeH:
он догадался о встраиваемой проблеме и о том, что она может быть связана с моей 64-битной архитектурой,
он предоставил флаг NoInlining, который является самым простым способом избежать такого поведения.
Однако теперь эта проблема поднимает другой вопрос: соответствует ли это поведение всем спецификациям .Net: CLR и языкам программирования С#?
ОБНОВЛЕНИЕ: эта оптимизация кажется совместимой в соответствии с: Throw VS rethrow: тот же результат? (спасибо 0xA3)
Заранее спасибо за вашу помощь.