您的位置:首页 > 其它

正确捕获 WCF服务调用中发生的异常及处理技巧

2010-01-13 19:42 429 查看
概述:本节主要讲述在服务调用中可能发生的异常及模拟异常的发生,并分析何时可捕获何种异常,以及如何把服务异常以正确的方式传递到客户端,

文章最后给出正确捕获异常的捕获顺序。本次异常捕获仅为介绍,部分为应用性功能,所以代码和行文相对简单,还介绍了在服务器端异常处理的一些技巧。

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>类型的异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐