通过Action对象实现任意代码片断的统一异常处理
2008-09-19 16:40
531 查看
通过Action对象实现任意代码片断的统一异常处理
这几天对自己写的一个小工具实行重构,发现有程序里要调用很多不同的WCF远程方法,都没有加上try...catch。因为错误处理都几乎相同(弹出消息框),不得不开始了体力劳动,重复地给代码加上相同的try...catch。
写了5次以后,懒人本能开始发作,琢磨起来有没有什么简单的方法能替我实现这一功能。突然想起来前几天写ForAll时候用到的Action对象,眼前看到了曙光。
介绍一下我的方法:
为了能够实现对任何方法的统一try...catch包装,需要通过匿名方法来实现。.NET 3新增加的类型Action,从实质上来说,它就是一个无参数委托。于是写了如下代码
class CommonExceptionProcessor
{
public static bool Invoke(Action a, ProcessError p)
{
try
{
a.Invoke();
return true;
}
catch (Exception ex)
{
//......通用错误处理,messagebox.show什么的
return false;
}
}
}
使用起来这样写
if (!CommonExceptionProcessor.Invoke(
() => client.SendMediaCommand(command)
))
return;
.......
程序功能是完成了,不过这个错误处理也太"通用"了点,稍微改进一下吧。
最终代码:
class CommonExceptionProcessor
{
public delegate void ProcessError(Exception ex);
public static bool Invoke(Action a, ProcessError p)
{
try
{
a.Invoke();
return true;
}
catch (Exception ex)
{
p(ex);
return false;
}
}
}
调用方法
if (!CommonExceptionProcessor.Invoke(
() => client.SendMediaCommand(command)
, pe))
//pe是一个弹消息框的委托
return;
这个设计可以很好地实现任意代码的try...catch统一处理。其实Action对象可以实现很多好玩的操作,比如IEnumable的ForAll。
写完了,继续研究偷懒办法去:)
这几天对自己写的一个小工具实行重构,发现有程序里要调用很多不同的WCF远程方法,都没有加上try...catch。因为错误处理都几乎相同(弹出消息框),不得不开始了体力劳动,重复地给代码加上相同的try...catch。
写了5次以后,懒人本能开始发作,琢磨起来有没有什么简单的方法能替我实现这一功能。突然想起来前几天写ForAll时候用到的Action对象,眼前看到了曙光。
介绍一下我的方法:
为了能够实现对任何方法的统一try...catch包装,需要通过匿名方法来实现。.NET 3新增加的类型Action,从实质上来说,它就是一个无参数委托。于是写了如下代码
class CommonExceptionProcessor
{
public static bool Invoke(Action a, ProcessError p)
{
try
{
a.Invoke();
return true;
}
catch (Exception ex)
{
//......通用错误处理,messagebox.show什么的
return false;
}
}
}
使用起来这样写
if (!CommonExceptionProcessor.Invoke(
() => client.SendMediaCommand(command)
))
return;
.......
程序功能是完成了,不过这个错误处理也太"通用"了点,稍微改进一下吧。
最终代码:
class CommonExceptionProcessor
{
public delegate void ProcessError(Exception ex);
public static bool Invoke(Action a, ProcessError p)
{
try
{
a.Invoke();
return true;
}
catch (Exception ex)
{
p(ex);
return false;
}
}
}
调用方法
if (!CommonExceptionProcessor.Invoke(
() => client.SendMediaCommand(command)
, pe))
//pe是一个弹消息框的委托
return;
这个设计可以很好地实现任意代码的try...catch统一处理。其实Action对象可以实现很多好玩的操作,比如IEnumable的ForAll。
写完了,继续研究偷懒办法去:)
相关文章推荐
- spring boot通过Interceptor和HandlerMethodReturnValueHandler实现统一处理为controller返回对象统计处理时间
- Go语言中统一异常处理实现方式
- 自己动手实现简单对象关系库谈到异常的处理与抛出
- 通过AOP 实现异常统一管理
- Android通过手势实现的缩放处理实例代码
- 关于合理使用SpringMVC统一异常处理机制以改善代码风格的一些思考
- 使用Spring实现异常统一处理【三】--java.lang.IllegalStateException: STREAM问题的解决
- 关于合理使用SpringMVC统一异常处理机制以改善代码风格的一些思考
- 通过spring的aop注解实现所有方法异常的捕获处理,sqlite SQLITE_BUSY异常
- JS date对象的减法处理实现代码
- 基于.Net Framework 4.0 Web API开发(3):ASP.NET Web APIs 异常的统一处理Attribute 和统一写Log 的Attribute的实现
- c#通过委托delegate与Dictionary实现action选择器代码举例
- iphone开发之通过代理模式实现自定义控件——代码示例图片库的处理
- spring @ExceptionHandler注解方式实现异常统一处理
- Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序
- Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
- Object 监视器方法分解成截然不同的对象, 以便通过将这些对象与任意Lock 实现组合使用,为每个对象提供多个等待 set
- MVC过滤器使用案例:统一处理异常顺道精简代码