近段时间做的一个三层架构+WCF+NHibernate的C/S项目,项目中的错误捕捉处理一直都很头疼,
今天终于找到了一个可以接受的方案。
首先,在前台捕捉所有未处理线程的错误做统一处理。
详见:WinForm程序中未处理异常的解决方法
其次,是WCF服务后台的错误处理,在错误契约把错误回发前台之前,把错误信息记录到错误日志。
可参见:
WCF分布式开发步步为赢(15):错误契约(FaultContract)与异常处理(ExceptionHandle)
最后,还需要一种简单灵活的错误处理方式,既不用手写try-catch块,又能对错误进行统一的处理。
按照设想,应该做到的功能是在要用try-catch块把要执行的方法包住。网上漫天找,什么C#AOP的也去看了,
都不是很理想,
想了很久,突然出现了一丝灵光,于是,便有了以下代码:
原理是C#的委托机制。
/// <summary> /// 要执行的方法 /// </summary> public delegate void MethodToDo(); /// <summary> /// 处理错误的方法 /// </summary> /// <param name="e">错误对象</param> public delegate void MethodDealException(Exception e); /// <summary> /// 将方法用try - catch块包围 /// </summary> public class TryCatch { private event MethodToDo methodToDo; private event MethodDealException methodDealException; /// <summary> /// 将方法用try - catch块包围 /// </summary> /// <param name="methodToDo">要执行的方法</param> public TryCatch(MethodToDo methodToDo) { this.methodToDo += methodToDo; Do(); } /// <summary> /// 将方法用try - catch块包围 /// </summary> /// <param name="methodToDo">要执行的方法</param> /// <param name="methodDealException">处理错误的方法</param> public TryCatch(MethodToDo methodToDo, MethodDealException methodDealException) { this.methodToDo += methodToDo; this.methodDealException += methodDealException; Do(); } public void Do() { if (this.methodToDo != null) { //获得委托列表 Delegate[] arr = this.methodToDo.GetInvocationList(); foreach (Delegate d in arr) { try { MethodToDo method = (MethodToDo)d; //同步执行方法 method.Invoke(); } catch (Exception ex) { if (this.methodDealException != null) //执行自定义错误处理方法 { Delegate[] err = this.methodDealException.GetInvocationList(); foreach (Delegate de in err) { MethodDealException me = (MethodDealException)de; me.Invoke(ex); } } else //执行统一的错误处理方法 { throw ex; } } } } } }
以上这个错误处理类可以这样调用:
先声明要执行的方法,如:
private void cal() { int i = calInt("a"); } private int calInt(string p) { return int.Parse(p); }
然后便可以调用处理类来执行了:
new TryCatch(cal);