gpt4 book ai didi

c# - 使用标准 try/catch 包装对类方法的调用

转载 作者:IT王子 更新时间:2023-10-29 04:41:28 25 4
gpt4 key购买 nike

我有一个包含大约 200 多个方法的类,这些方法中的每一个都会调用数据库或网络资源。

理想情况下,我想将每个调用包装在一个 try/catch 中,以捕获任何常见的网络或 SQL 异常,并让用户有机会重试(如果合适)。但是,将此代码添加到每个调用将非常耗时,并且就代码而言是臃肿的。

我考虑过将每个方法调用包装在另一个方法中,创建一个委托(delegate),然后将委托(delegate)代码包装在 try/catch 中……就像这样……

(忽略语法..这只是一个概念性的例子)

bool CallUpdatePassenger(int PassengerId,string PassengerName,string PhoneNumber)
{
Delegate del= Delegate.CreateDelegate(typeof(UpdatePassengerDelegate), typeof(IPassengerServices).GetMethod("RemoteUpdatePassenger"));
bool Res=(bool)CallDelegate(del,PassengerName,PhoneNumber);
}
object CallDelegate(Delegate del,params object[] args)
{
object Result=null;
try
{
Result=del.DynamicInvoke(args);
}
catch (Some.Timeout.Error.Or.Whatever te)
{
// take some action.. maybe retry etc..
}
return Result;
}

也许有更实用的方法来做到这一点?

代码是自动生成的(通过我编写的工具)我可以很容易地包含类似上面的内容,但我想避免为每个方法调用都编写上面的代码。

另外,如果我做类似上面的事情,我可以计时方法,记录方法调用等。它看起来有点笨拙(而且不是强类型)。

谢谢丰富。

最佳答案

你应该能够做类似的事情:

T Execute<T>(Func<T> func) {
try {
return func();
} catch (...) {
...
}
}
bool CallUpdatePassenger(some args here) {
return Execute( () => realObj.RemoteUpdatePassenger(some args here));
}

或者,您可以使用元编程为底层方法即时编写动态“装饰器”……但除非您熟悉 ILGenerator 等,否则最好不要这样做 - 它是一个相当高级的主题。

关于c# - 使用标准 try/catch 包装对类方法的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8617814/

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