对于客户端来说,远程调用出现异常需要手动捕获,否则将导致程序异常终止。
对于服务器端来说,客户调用是出现的异常会往上抛,但是会被WCF框架给捕获,不会导致服务器崩溃,可以不手动捕获。例如,如下服务函数被调用时并不会导致服务器崩溃:
public class Service1 : IService1 { public void ErrorTest() { throw new InvalidOperationException("异常测试"); } }
但值得注意的是:服务被设置为PerSession模式或者Single模式,服务异常还会导致服务对象被释放而终止服务。(这个是在网上看到的说明,但我自己试的时候没有挂,也没有看到MSDN上哪儿有写,待后续确认后再更新)
但是,WCF框架也仅仅只捕获服务接口所抛出的异常,对于其它的异常,则和传统方式一致,例如,如下代码就会导致WCF服务器崩溃,需要我们注意。
public class Service1 : IService1 { public void ErrorTest() { ThreadPool.QueueUserWorkItem(_ => { throw new InvalidOperationException("异常测试"); }); } }
另外,被WCF框架捕获的异常中,有的可能是确实需要传递给客户端的,有的则可能是我们代码中的bug。因此,往往需要我们对其记录一下,这里仍可以通过上一章中介绍的IErrorHandler接口实现,在HandleError函数中记录异常信息,以便后续分析。
public class ErrorHandler : IErrorHandler { public bool HandleError(Exception error) { Debug.WriteLine("Got error: " + error.Message); return false; } public void ProvideFault(Exception error, MessageVersion version, ref Message fault) { var ex = new FaultException(error.Message); var mf = ex.CreateMessageFault(); fault = Message.CreateMessage(version, mf, ex.Action); } }
除了这个手动记录的方法外,在文章中介绍了一个配置日志实现记录异常的方法,可以参考一下。