gpt4 book ai didi

c# - 如何摆脱try catch?

转载 作者:可可西里 更新时间:2023-11-01 08:51:47 28 4
gpt4 key购买 nike

我厌倦了像这样的 try catch 周围的代码..

try
{
//some boring stuff
}
catch(Exception ex)
{
//something even more boring stuff
}

我想要这样的东西

SurroundWithTryCatch(MyMethod)

我知道我可以通过创建一个具有函数的确切签名的委托(delegate)来完成此行为,但是为我的应用程序中的所有方法创建一个委托(delegate)这不是一个选项。

我也可以通过注入(inject) IL 代码来做到这一点,但这在性能方面很昂贵,因为它会在我的周围创建一个包装程序集。

还有其他有效的想法吗?

最佳答案

首先,听起来您可能过于频繁地使用 try/catch - 特别是当您正在捕获 Exception 时。 try/catch block 应该相对少见;除非你真的可以“处理”异常,否则你应该让它冒泡到堆栈的下一层。

现在,假设您确实确实想要所有这些 try/catch block ,为什么不能选择创建委托(delegate)?使用匿名方法和 lambda 表达式,以及 System 命名空间中的 Func/Action 委托(delegate),基本上可以做很少的工作。你写:

public void SurroundWithTryCatch(Action action)
{
try
{
action();
}
catch(Exception ex)
{
//something even more boring stuff
}
}

然后你的 SurroundWithTryCatch(MyMethod) 将正常工作,如果它不需要参数的话。

或者,如果您不想调用不同的方法,只需编写:

public void MyMethod()
{
SurroundWithTryCatch(() =>
{
// Logic here
});
}

如果你需要从方法中返回,你可以这样做:

public int MyMethod()
{
return SurroundWithTryCatch(() =>
{
// Logic here
return 5;
});
}

使用 SurroundWithTryCatch 的通用重载,如下所示:

public T SurroundWithTryCatch<T>(Func<T> func)
{
try
{
return func();
}
catch(Exception ex)
{
//something even more boring stuff
}
}

其中大部分在 C# 2 中也没有问题,但类型推断对您的帮助不大,您将不得不使用匿名方法而不是 lambda 表达式。

回到开头:尽量少用 try/catch。 (try/finally 应该更频繁,尽管通常写成 using 语句。)

关于c# - 如何摆脱try catch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/280127/

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