概述:
在实际的项目开发中,我们常常会处理各种各样的异常,在代码中不断充斥着try{}catch{}finally{}语句块,这些处理有些时候是不可缺少的,因为谁都没有办法保证自己写的代码无异常运行,外部环境造成了异常存在的可能性,但是我常常觉得,捕获异常的语句块经常把原本清晰的业务逻辑弄得七零八落的,当然,本篇的目的不是说异常捕获可完全避免,但到少WCF可以让我们稍微从异常处理中得到一点解脱。
1、首先来看常规的服务实现类在处理异常时的做法,下面是常规的捕获了一个除数为0的异常。
常规异常捕获
public string Div(int x,int y)
{
int result=0;
try
{
result = x / y;
}
catch (DivideByZeroException ex)
{
throw ex;
}
return string.Format("{0}",result);
}
2、再看看应用了IErrorHandler接口来处理异常后的代码。
public string Div(int x,int y)
{
return string.Format("{0}",x/y);
}
有爽的感觉吗?如果没有,请仔细想想1000个方法中的异常处理。这就是WCF让程序自己抛出异常并自行捕获。
3、如何实现?
3.1、要达到上述的效果,我们需要自定义一类并实现IErrorHandler接口,代码相当的简单,如下:
public class FaultErrorHandler : IErrorHandler
{
#region IErrorHandler 成员
public bool HandleError(Exception error)
{
// TO DO 在这里可以做日志记录等。
Console.WriteLine("Message:{0},StackTrace:{1}",error.Message,error.StackTrace);
return true;
}
public void ProvideFault(Exception error,MessageVersion version,ref Message fault)
{
FaultException fe = new FaultException(error.Message,FaultCode.CreateReceiverFaultCode(error.Source,error.StackTrace));
MessageFault messagefault = fe.CreateMessageFault();
fault = Message.CreateMessage(version,messagefault,"http://www.microsoft.com/");
}
#endregion
}
只有十来行代码,相当于我们以前的创建日志文件代码。