您的位置:首页 > 编程语言

通过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。
写完了,继续研究偷懒办法去:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐