错误与异常

      在传统的.NET编程中,任何未经处理的异常都会立刻终止抛出异常的进程。但WCF却与之大相径庭。如果代表某个客户端的服务调用导致异常,并不会结束宿主进程,其他客户端仍然可以访问该服务,托管在相同进程中的其他服务也不会受到影响。因此,当一个未经处理的异常离开服务的范围时,分发器会捕获它,并将它序列化到返回消息中传递给客户端。当返回消息到达代理时,代理会在客户端抛出一个异常。

当客户端试图调用服务时,实际上可能会遭遇三种错误类型。第一种错误类型为通信错误,例如网络故障、地址错误、宿主进程没有运行等。客户端的通信错误表现为CommunicationException异常。

      客户端可能遇到的第二种错误类型与代理和通道的状态有关,例如试图访问已经关闭的代理,就会导致ObjectDisposedException异常。或者契约与绑定的安全保护级别不相匹配,也会出现错误。第三种错误类型源于服务调用。这种错误既可能是服务抛出的异常,也可能是服务在调用其他对象或资源时,通过内部调用抛出的异常。这些错误正是本章所要讲述的主题。出于封装与解耦的目的,在默认情况下,所有服务端抛出的异常总是以FaultException类型到达客户端:

 public class FaultException : CommunicationException
{...}
如果要解耦客户端与服务,就应该对所有的服务异常一视同仁。客户端知道服务端发生的内容越少,则两者之间关系的解耦才越彻底。

posted @ 2008-10-09 09:19  Mashimaro  阅读(223)  评论(0编辑  收藏  举报