Web服务是一种完成分布式计算的相关新方法。在分布式计算中,应用程序被设计为服务运行在服务器上。客户端通过一个可编程的接口访问这些服务。当在Web服务的执行期间发生了异常,Web服务应该不只是捕捉到异常,还应该把异常传回给Web服务的客户端。因为Web服务提供一种平台无关的方法来支持特定功能,所以Web服务中发生的异常也必须以一种平台无关的方式被传回。为了达到这个目的,必须确保Web服务所产生的异常兼容SOAP规范。本文中,我们将了解怎样使用SoapException对象从Web服务中抛出异常,而SoapException对象提供了一种表示SOAP Fault的工业标准方法。我们还将了解怎样在Web服务的客户端应用程序中处理这个异常。
简介
异常是正在执行的程序所遇到的任何错误情形或者意外行为。很多原因都可以引起异常,例如,代码中错误、操作系统资源不可用、公共语言运行时(common language runtime)中的意外情况等等。然而应用程序能够从上述的一些情况中恢复执行,但是大多数运行时异常是不可恢复的。在这种情况下,需要一种有效的方法来处理这些异常并给调用者提供相同的异常。
用结构化的异常处理方法来处理异常
在.NET Web服务中,对异常处理支持的关键点是由try...catch..finally语句提供的。关键字try放在可能抛出异常的普通处理代码块之前。关键字catch放在异常处理代码块之前。关键字finally放在那些经常在异常处理后还需要执行的代码块之前。一旦异常从try代码块中抛出,程序流切换到后面的第一个catch代码块。一套设计良好的错误处理代码块可以成功的使程序变得更加健壮,使程序崩溃的机率变得更小,那是因为应用程序处理像这样的错误所采取的方法的缘故。处理异常的最好实践可以总结如下:
l 经常用try/finally块包围潜在的可能发生错误的代码,并且把catch语句集中在一个地方。用这种方法,try语句抛出异常,finally语句关闭或释放资源,而catch语句则集中处理异常。
l 通常,catch语句块从非常特殊到一般来排列异常。这个技巧使得异常被传递到一般catch块之前先处理特殊异常。
l 大多数情况下,使用已有的异常类型。新的异常类型应该仅在有计划的情形下引进。
l 使用异常的构建方法。一个类的实现中在不同地方抛出同一个异常,这是非常普遍的现象。为了避免出现过量的这类代码,使用助手方法创建异常和返回异常。
至此,我们已经大致了解处理异常的最好实践,下面就让我们看看怎样从Web服务中抛出异常。
从Web服务中抛出异常
在Web服务中处理异常与在Web或Windows应用程序中处理异常没有什么区别。但是,在设计Web服务中的异常块时,必须明白一个事实,即你需要以一种平台无关的基于SOAP规范的方式把异常信息传递给Web服务的客户端。为了达到这个目的,你应该使用SoapException类,它抽象了SOAP Fault创建过程的复杂度。SoapException类具有下列属性,并且这些属性必须在把异常抛出给客户端之前被设定。
l Message--异常的内容
l Code--指定Fault编码类型(例如,ClientFaultCode和ServerFaultCode)的枚举常量
l Actor--发生异常的Web服务方法的URL
l Detail--Detail元素可以用来把更多的异常信息传递给调用者。