正确捕获 WCF服务调用中发生的异常及处理技巧
2010-01-13 19:42
429 查看
概述:本节主要讲述在服务调用中可能发生的异常及模拟异常的发生,并分析何时可捕获何种异常,以及如何把服务异常以正确的方式传递到客户端,
文章最后给出正确捕获异常的捕获顺序。本次异常捕获仅为介绍,部分为应用性功能,所以代码和行文相对简单,还介绍了在服务器端异常处理的一些技巧。
1、 首先,我们创建一个简单的计算器服务器和客户端,如下:
从上面的代码中可以看出,在服务通道关闭以后,我们立即将服务中止,让消息立即返回,这时候即使在操作中关闭了服务而又未指定超时完成的时间,调用依然可以立即返回。
这次客户端总算捕获到了CommunicationException异常,见下图:
为何会这样?
8、让我们来看一下CommunicationException的继承层次,从中我们可以得到启示。
8.1、首先是FaultException<TDetail>的继承层次。
8.2、再次是TimeOutException的继承层次。
9、从上图中可以看出,TimeOutException和CommunicationException均继承自SystemException类,而FaultException继承自CommunicationException,最后是FaultException<TDetail>继承自FaultException类。
10、最后我们得出,在客户端正确的捕获异常的顺序应该是:
TimeOutException> FaultException<TDetail> > FaultException >CommunicationException > Exception。在这里强烈建议开发人员抛出和捕获FaultException<TDetail>类型的异常。
文章最后给出正确捕获异常的捕获顺序。本次异常捕获仅为介绍,部分为应用性功能,所以代码和行文相对简单,还介绍了在服务器端异常处理的一些技巧。
1、 首先,我们创建一个简单的计算器服务器和客户端,如下:
public abstract partial class ServiceBase { private IContextChannel channel = null; protected ServiceBase() { channel = OperationContext.Current.Channel; channel.Opening += new EventHandler(delegate(object sender, EventArgs e) {/* TO DO*/ }); channel.Opened += new EventHandler(delegate(object sender, EventArgs e) {/* TO DO*/ }); channel.Closing += new EventHandler(delegate(object sender, EventArgs e) {/* TO DO*/ }); channel.Closed += new EventHandler(delegate(object sender, EventArgs e) { Abort(); }); channel.Faulted += new EventHandler(delegate(object sender, EventArgs e) { Abort(); }); } void Open() {/* TO DO*/ } void Close() { /* TO DO*/} void Abort() { channel.Abort(); } }
从上面的代码中可以看出,在服务通道关闭以后,我们立即将服务中止,让消息立即返回,这时候即使在操作中关闭了服务而又未指定超时完成的时间,调用依然可以立即返回。
这次客户端总算捕获到了CommunicationException异常,见下图:
为何会这样?
8、让我们来看一下CommunicationException的继承层次,从中我们可以得到启示。
8.1、首先是FaultException<TDetail>的继承层次。
8.2、再次是TimeOutException的继承层次。
9、从上图中可以看出,TimeOutException和CommunicationException均继承自SystemException类,而FaultException继承自CommunicationException,最后是FaultException<TDetail>继承自FaultException类。
10、最后我们得出,在客户端正确的捕获异常的顺序应该是:
TimeOutException> FaultException<TDetail> > FaultException >CommunicationException > Exception。在这里强烈建议开发人员抛出和捕获FaultException<TDetail>类型的异常。
相关文章推荐
- WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
- [原创] WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
- WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理(转)
- 【转】WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
- WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
- WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
- "调用的目标发生了异常。"问题处理
- 服务端增加WCF服务全局异常处理机制
- WCF并发(Concurrency)的本质:同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求
- 异常的发生,捕获,处理
- Ajax程序:处理异步调用中的异常(在客户端调用Web Service代理时发生异常的处理办法)
- WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?
- WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?
- WCF 服务调用RFC 出现异常
- WCF服务在高并发情况下报目标积极拒绝的异常处理 z
- WCF服务全局异常处理机制
- 6.2判断一个数能否被3整除,如果不能整除就抛出一个异常,并让其调用方法来捕获,显示相应的处理信息
- WCF并发(Concurrency)的本质:同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求(转)
- WCF在同步和异步调用情况下的异常捕获
- WCF在同步和异步调用情况下的异常捕获