当前位置: 首页 > 编程语言 > C#

使用标准try - catch包装对类的方法的调用分享

时间:2023-04-10 17:55:55 C#

C#学习教程:使用标准try/catch包装对类方法的调用网络资源。理想情况下,我想将每个调用包装在try/catch中以捕获任何常见的网络或SQL异常,并让用户有机会重试(如果适用)。但是,将此代码添加到每个调用中会耗费时间,并且代码会臃肿。我考虑过将每个方法调用包装在另一个方法中,创建一个委托,并将委托代码包装在一个try/catch中......像这样......(忽略语法......这只是一个概念性的例子)boolCallUpdatePassenger(intPassengerId,stringPassengerName,stringPhoneNumber){Delegatedel=Delegate.CreateDelegate(typeof(UpdatePassengerDelegate),typeof(IPassengerServices).GetMethod("RemoteUpdatePassenger")););}objectCallDelegate(Delegatedel,paramsobject[]args){objectResult=null;尝试{结果=del.DynamicInvoke(args);}catch(Some.Timeout.Error.Or.Whateverte){//采取一些行动..也许重试等..}returnResult;也许有更实用的方法来做到这一点?代码是自动生成的(通过我编写的工具),我可以轻松地包含上面的代码,但我想避免为每个方法调用都编写上面的代码。另外,如果我做类似上面的事情,我可以计时方法,记录方法调用等。它看起来有点笨拙(而不是强类型)。谢谢里奇。你应该能够做这样的事情:TExecute(Funcfunc){try{returnfunc();}catch(...){...}}boolCallUpdatePassenger(这里有一些参数){returnExecute(()=>realObj.RemoteUpdatePassenger(这里有一些参数));或者,您可以使用元编程为动态底层方法编写动态“装饰器”……但除非您熟悉ILGenerator等,否则最好不要这样做——这是一个相当高级的主题。我认为您的基本想法很好,但是有一种更简单的方法可以做到这一点(至少如果您使用的是.Net3.5或更新版本):voidWithStandardRetryLogic(Actionmethod){try{method();}catch(Some.Timeout.Error.Or.Whateverte){//采取一些行动..也许重试等..}}用法示例:WithStandardRetryLogic(delegate(){CallUpdatePassenger(PassengerId,PassengerName,PhoneNumber);});这也可能是AOP框架可能对某些东西有用,但我还没有尝试过这个解决方案。如果可以使用PostSharp,则可以使用以下方面:[Serializable]publicclassRetryAttribute:MethodInterceptionAspect{privatereadonlyint_times;publicRetryAttribute(inttimes){_times=times;}publicoverridevoidOnInvoke(MethodInterceptionArgsargs){for(varleft=_times;left>0;left--){try{args.Proceed();休息;}赶上(异常){}}args.Proceed();//可选}}用法如下:[Retry(2)]publicstaticvoidDoIt(){Console.WriteLine("tried");抛出新的异常();我认为一种可能的解决方案是AOP编程。您可以使用属性标记您想要的任何方法,并在编译时注入try/catch代码。在此处查看示例希望这会有所帮助。以上就是C#学习教程:使用标准的try/catch来包装对类的方法的调用。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: