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