Welcome

首页 / 软件开发 / WCF / WCF分布式开发步步为赢(15)

WCF分布式开发步步为赢(15)2011-06-17 博客园 Frank Xu Lei今天学习WCF分布式开发步步为赢系列的15节:错误契约(FaultContract)与异常处理(ExceptionHandle)。本节内容作为 WCF分布式开发的一个重要知识点,无论在学习还是项目中都应该有所了解。此前也和多位学习爱好者讨论过WCF异常处理的相关知识。这里就系统整理一下,共大家参考。同时也是对《WCF分布式开发步步为赢》系列文章的完善和补充。

本节主要涉及的知识点就是:【1】.NET异常处理【2】WCF异常处理【3】错误契约【4】WCF异常处理扩展【5】示例代码分析,最后是【6】总结部分。

首先我们来回忆一下.NET里一个重要的概念异常处理ExceptionHandle。异常处理在JAVA平台也有自己的机制,这个不是一个WCF特有的概念,同样要了解WCF的异常处理,我们有必要先来了解其前身.NET的异常处理相关的概念。

【1】.NET异常处理:

.NET Framework 中的托管异常是凭借 Win32 结构化异常处理机制实现的。公共语言运行库提供了一个模型,以统一的方式通知程序发生的错误,这样为设计容错软件提供了极大的帮助。所有的.NET Framework操作都通过引发异常来指示出现错误。传统上,语言的错误处理模型依赖于语言检测错误和查找错误处理程序的独特方法,或者依赖于操作系统提供的错误处理机制。运行库实现的异常处理具有下列特点:

处理异常时不用考虑生成异常的语言或处理异常的语言。

异常处理时不要求任何特定的语言语法,而是允许每种语言定义自己的语法。

允许跨进程甚至跨计算机边界引发异常。

与其他错误通知方法(如返回代码)相比,异常具有若干优点。不再有出现错误而不被人注意的情况。无效值不会继续在系统中传播。不必检查返回代码。可以轻松添加异常处理代码,以增加程序的可靠性。最后,运行库的异常处理比基于Windows 的C++错误处理更快。

由于执行线程例行地遍历托管代码块和非托管代码块,因此运行库可以在托管代码或非托管代码中引发或捕捉异常。非托管代码可以同时包含C++样式的 SEH 异常和基于COM 的HRESULT。

异常处理使用 try、catch 和 finally 关键字尝试某些操作,以处理失败情况,尽管这些操作有可能失败,但如果您确定需要这样做,且希望在事后清理资源,就可以尝试这样做。公共语言运行时 (CLR)、.NET Framework 或任何第三方库或者应用程序代码都可以生成异常。异常是使用 throw 关键字创建的。(MSDN)

【2】WCF异常处理:

现在我们来了解一下WCF的异常处理机制。前面我们介绍了.NET的异常处理机制。WCF也是.NET框架的一部分,很多一场处理方式基本相同。但是由于其跨服务平台的目标要求,导致了WCF并不支持传统的异常处理方式。传统方式上.NET抛出的未经处理的异常会立即终止主进程,而WCF则不会。

【2.1】WCF错误类型:

在进行WCF分布式应用开发的过程中,我们客户端经常会遇到一下三种常见的错误。

(1):通信错误,可能和网络、通道等相关的异常,客户端表现为Communication Exception;

(2):代理和通道的State,代理已经关闭,或者通道Fault,等问题,这个比较常见。一般通道闲置时间过久,通道会出现这个状态错误的问题。一般我们可以通过代理的State来判断。安全验证失败也会导致这个错误。

(3):服务调用错误,服务调用时抛出的异常,这个服务内部异常会序列化传递给客户端,被客户端捕获。

第三种是我们本节要详细讲述的类型。