SOAP异常处理

在客户端调用服务端方法时候,并非一路顺风的,就须要soap的异常处理来找到问题的所在:

调试咱们的程序 —— 捕获异常
考虑一个咱们编写代码时极可能出现的错误:在为调用的操做输入参数时,参数中某个元素的名字错误或是没有提供。例如咱们把查询须要的产品代码的名字错误地写成了"ProductCod",这时运行客户端代码,是不可能获得正确的结果的。咱们怎么才能发现这个错误呢?
PHP 5 中新增了不少编程语言中都提供的异常处理机制 try...catch,咱们能够把客户端的实现代码包含在这个结构里 ( 须要注意的是,PHP 5 中不支持 finally 子句 ):

清单 14. 加入异常处理部分的客户端代码php

try
{
$client = new SoapClient('./ProductQuery.wsdl');
$result = $client->__soapCall('QuerySpec', array( array( "ProductCod" => '1175-PXA' ) ) );
echo "Product Code:" . $client->ProductCode . "<br />";
echo "Product Code:" . $client->CPU . "<br />";
echo "Product Code:" . $client->RAM . "<br />";
echo "Product Code:" . $client->Screen . "<br />";
echo "Product Code:" . $client->HDD . "<br />";
}
catch (SoapFault $e)
{
echo $e;
}

咱们会在浏览器中获得这样的输出:编程


清单 15. Web 服务端返回的异常信息:缺乏属性

SoapFault exception:  [Client] SOAP-ERROR: Encoding: object hasn't 'ProductCode' property in  C:\xampp\htdocs\soapTest\GetProductInfo.php:17  Stack trace:  #0 C:\xampp\htdocs\soapTest\GetProductInfo.php(17): SoapClient->__soapCall('QuerySpec',  Array)  #1 {main}

在 这个例子中,异常是由 SoapClient 对象直接抛出的,它检查输入的参数,若是发现某个 WSDL 文件中定义的项没有被提供,便抛出这个异常,告诉咱们"ProductCode"属性没有被提供。而咱们经过有针对性的检查代码,就能够比较容易的发现错 误所在。服务端一样也可能抛出异常,这些异常一般是客户端检查时没法发现的,例如某些逻辑错误,若是咱们输入了一个不合法的产品代码,就可能捕获到服务端 抛出的“不合法的产品代码”异常。为了实现这一功能,咱们须要在服务端的代码中加入下面的一段语句:浏览器



清单 16. Web 服务端抛出产品代码无效的异常

if( !$result ){  throw new SoapFault("Server", "Invalid Product Code!");  }

这 段语句在未获得查询结果的状况下(这时认为缘由是提供了无效的产品代码),抛出了一个 SoapFault 异常,用于建立 SoapFault 对象的参数包括错误代码,以及必要的错误信息。须要注意的是,错误代码只能使用 SOAP 标准中已定义的值,使用其余的值不会返回正确的信息。具体可以使用的值能够查看 W3C 的 SOAP 文档。这样,在客户端提供无效的产品代码时,会捕获到的异常信息:编程语言


清单 17. Web 服务端返回的异常信息:产品代码无效

SoapFault exception:  [SOAP-ENV:Server] Invalid Product Code! in C:\xampp\htdocs\soapTest\GetProductInfo.php:17  Stack trace:  #0 C:\xampp\htdocs\soapTest\GetProductInfo.php(17): SoapClient->__soapCall('QuerySpec', Array)  #1 {main}

因而咱们就知道提供的产品代码是无效的了。ide