如何处理Web服务异常(1)

发表于:2007-06-13来源:作者:点击数: 标签:
异常是一个事件,它出现在程序执行过程当中,会中断程序指令的正常流程。如果一种方法或者一项Web服务操作出现错误,就会出现异常。引起错误的可能是程序 缺陷 或者缺少系统资源。典型的问题包括如下:用户输入错误:用户无意中输入了不正确的字符; 物理限

异常是一个事件,它出现在程序执行过程当中,会中断程序指令的正常流程。如果一种方法或者一项Web服务操作出现错误,就会出现异常。引起错误的可能是程序缺陷或者缺少系统资源。典型的问题包括如下:用户输入错误:用户无意中输入了不正确的字符; 物理限制:磁盘空间已满或者溢出可用内存;设备错误:硬件不能正常工作,如无法启用的USB移动硬盘;网络错误:应用服务器试图使用Java数据库连接性(JDC)连接到远程数据库。

要是被调用方法即提供者出现错误,就必须通知调用程序即使用者。这时,通过编程实现的复杂的异常处理就可以发挥作用:异常出现在调用程序面前,以便从异常中恢复过来。高明的编程人员通常会预料到异常,然后通过编写程序来处理它们;不过,不是所有异常都是能预料到的,也不是所有异常都是能够恢复的。要是没发现异常处理程序,运行系统就会终止、出现不可靠的动作。

Java和.Net等编程接口拥有一系列广泛、复杂的异常处理功能。开发人员可以使用if-then-else条件结构和try-catch-finally代码块来构建一组丰富的错误处理模式。使用这样一些异常处理模式,开发人员就可以降低程序严重崩溃或者程序突然终止的风险,并且为应用程序添加可靠性

在基于Web服务的分布式架构里面,异常处理必须满足额外需求。如今,异常必须能独立于操作系统、编程语言和应用程序进行传送。异常必须提供给使用者,那样它们就随时可以解释; 如果某异常能够恢复,使用者就可以无缝应答Web服务提供者抛出的异常,提供者可能在企业IT部门的里面,也可能在外面。在传送这种异常时,还要关注企业安全。如果异常处理不严格、不认真、不慎重,提供者的Web服务就有可能把内部IT资产的详细信息透露给使用者,或者在堆栈跟踪中泄漏敏感的企业信息。

为了探讨Web服务的异常处理,本文构建了一个简单的Java类,使用众多的类似方法对两个数进行除法运算。这些方法处理异常的能力各不相同,有的方法完全缺少异常处理机制,而有的方法对许多异常场景拥有显式异常处理结构。如图1所示,我们使用以下组件来准备异常处理测试

1.BEA WebLogic Portal 9.2是面向基于Java应用开发的一款应用服务器。安装程序包括BEA Workshop for WebLogic Platform,这是用于迅速构建Web服务的一种IDE。我们决定使用WebLogic,因为它在业界的应用很广泛,而且易于构建Web服务。

2.Crosscheck Networks SOAPSonar是一个Web服务测试客户程序,它使用WSDL,并且可以为目标Web服务生成功能、性能、互操作性和漏洞等测试。

未保护的Web服务

第一个Web服务根本没有防范不利条件的机制。如以下代码所示,这个基本方法读入几个双精度输入,然后除数除被除数,返回作为结果的双精度值。

package mathservice; 

import javax.jws.*;

@WebService

public class DivideWS {

@WebMethod

public double nakedDivide(double dividend, double divisor)

{

 return dividend/divisor;

}

}

测试显示了nakedDivide(…) Web方法的行为:正面测试显示,Web服务对输入数字进行了正常除法; 如果输入了零除数,应用服务器就会进行恰当处理,并返回INF值; 如果被除数或者除数什么也没有输入,就会显示详细的堆栈跟踪,还有关于XML处理内部的列表信息,譬如串行化器、SOA服务器协议处理程序和实现平台。

一般而言,堆栈跟踪信息对Web服务使用者毫无用处,使用者也没有多少办法可以从这样的通用、冗长的异常中恢复过来。这不像一组简单的文档返回代码发送到客户程序、从除以零或者空值异常中轻松恢复过来。发送到客户程序的堆栈跟踪信息不但毫无用处、代码上不可执行,它还可能会把实现细节传送给外部使用者,有可能被人进一步利用。

防御性Web服务

下面的代码片显示,防御性Web服务defensiveDivide(…)建立在前一个方法nakedDivide(…)上的基础上,添加了简单的检查机制查看除数是不是零。这可以确保除以零错误不会出现。如果除数是零,该方法就会返回0,那样调用程序就可以从不合适的零除数输入中恢复过来。在这种方法中,编程人员预料到了边界条件,编写防御性代码来处理它。

@WebMethod 

public double defensiveDivide(double dividend, double divisor)

{

if (divisor != 0)

 return dividend/divisor;

else

return 0;

}

几个正面和负面测试很快显示了defensiveDivide(…) Web方法的行为:正面测试显示,Web服务对输入数值进行了正常的除法; 如果输入了零除数,不像nakedDivide(…)会在试图进行除法运算后,返回表示无限大的INF值,defensiveDivide(…)返回的是编程人员定义的显式0.0错误值,连除法运算试都不试一下;如果被除数或者除数什么也没有输入,就像nakedDivide()那样,就会显示详细的堆栈跟踪,还有关于XML处理内部的列表信息,譬如串行化器、SOA服务器协议处理程序和实现平台。
共2页: 1 [2] 下一页

原文转自:http://www.ltesting.net

...