WCF入门(九)——未处理异常

本文介绍了WCF服务中异常处理的机制,包括客户端与服务器端的不同处理方式,服务模式对异常的影响,以及如何通过IErrorHandler接口记录异常信息。

对于客户端来说,远程调用出现异常需要手动捕获,否则将导致程序异常终止。

对于服务器端来说,客户调用是出现的异常会往上抛,但是会被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);
        }
    }

除了这个手动记录的方法外,在文章Troubleshoot WCF exception中介绍了一个配置日志实现记录异常的方法,可以参考一下。

转载于:https://www.cnblogs.com/TianFang/archive/2013/01/04/2843779.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值