http://lwbpeter.blog.163.com/blog/static/38508211201007105437493/
近段时间做的一个三层架构+WCF+NHibernate的C/S项目,项目中的错误捕捉处理一直都很头疼,
今天终于找到了一个可以接受的方案。
首先,在前台捕捉所有未处理线程的错误做统一处理。
其次,是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.methodToDo.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);