gpt4 book ai didi

C# 我需要 TRY/CATCH 才能抛出吗?

转载 作者:太空狗 更新时间:2023-10-29 17:31:55 25 4
gpt4 key购买 nike

如果我只想在异常发生时将异常抛出一个级别?

private void TryCatch()
{
try
{
foo();
}
catch (Exception ex)
{
throw;
}
}

private void NoTryCatch()
{
foo();
}

这两个方法不是一样的吗?

如果TryCatch发生异常,则向上抛出一个异常,如果NoTryCatch发生异常,则同样向上抛出一个异常。

这个问题是在使用 ReSharper 并注意到它建议删除多余的 try/catch block 之后出现的。

最佳答案

是的,这些方法几乎 (*) 相同。唯一的区别是在第一个断点中放置断点很容易。我总是选择第二个,除非我真的需要在那里中断并且只在那里中断(而不是立即抛出该类型的任何异常,这很容易)。即使我曾经使用过第一种形式,我也会在提交代码之前将其恢复为第二种形式。

(*) JIT 处理它们的方式可能存在一些差异。第一个将以更多的 IL 结束,这将影响内联等的机会。

编辑:我无法抗拒微基准测试。看起来 try/catch/throw 对性能的影响比仅仅禁用内联更严重:

using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;

public class Test
{
const int Iterations = 1000000000;

static void Main()
{
Stopwatch sw;

sw = Stopwatch.StartNew();
for (int i=0; i < Iterations; i++)
{
SimpleMethod();
}
sw.Stop();
Console.WriteLine("Simple method: {0}", sw.ElapsedMilliseconds);

sw = Stopwatch.StartNew();
for (int i=0; i < Iterations; i++)
{
NoInlining();
}
sw.Stop();
Console.WriteLine("No inlining: {0}", sw.ElapsedMilliseconds);

sw = Stopwatch.StartNew();
for (int i=0; i < Iterations; i++)
{
TryCatchThrow();
}
sw.Stop();
Console.WriteLine("try/catch/throw: {0}", sw.ElapsedMilliseconds);
}

static void SimpleMethod()
{
Foo();
}

[MethodImpl(MethodImplOptions.NoInlining)]
static void NoInlining()
{
}

static void TryCatchThrow()
{
try
{
Foo();
}
catch (Exception)
{
throw;
}
}

static void Foo() {}
}

编译/o+/debug-

结果(三轮):

简单方法:504、495、489
无内联:2977、3060、3019
尝试/捕捉/抛出:5274、4543、5145

关于C# 我需要 TRY/CATCH 才能抛出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/431785/

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