gpt4 book ai didi

c# - 抛出 VS 重新抛出 : same result?

转载 作者:可可西里 更新时间:2023-11-01 09:07:46 25 4
gpt4 key购买 nike

引用了网上的大量文档,尤其是关于 SO 的文档,例如:What is the proper way to re-throw an exception in 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 : same result?(感谢 0xA3),此优化似乎符合要求

预先感谢您的帮助。

最佳答案

我无法重现这个问题——使用 .NET 3.5(32 位)给我的结果与 Bart 的文章中描述的相同。

我的猜测是 .NET 4 编译器/抖动——或者可能是 64 位编译器/抖动,如果这也在 3.5 下发生——正在将 BadGuy 方法内联到调用中方法。尝试添加以下 MethodImpl属性为 BadGuy 并查看是否有任何区别:

[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
private static void BadGuy()
{
//
// Some nasty behavior.
//
throw new Exception();
}

关于c# - 抛出 VS 重新抛出 : same result?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3552125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com