在客戶端調用服務端方法時候,並非一路順風的,就須要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;
}
咱們會在瀏覽器中獲得這樣的輸出:編程
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"屬性沒有被提供。而咱們經過有針對性的檢查代碼,就能夠比較容易的發現錯 誤所在。服務端一樣也可能拋出異常,這些異常一般是客戶端檢查時沒法發現的,例如某些邏輯錯誤,若是咱們輸入了一個不合法的產品代碼,就可能捕獲到服務端 拋出的「不合法的產品代碼」異常。爲了實現這一功能,咱們須要在服務端的代碼中加入下面的一段語句:瀏覽器
if( !$result ){ throw new SoapFault("Server", "Invalid Product Code!"); } |
這 段語句在未獲得查詢結果的狀況下(這時認爲緣由是提供了無效的產品代碼),拋出了一個 SoapFault 異常,用於建立 SoapFault 對象的參數包括錯誤代碼,以及必要的錯誤信息。須要注意的是,錯誤代碼只能使用 SOAP 標準中已定義的值,使用其餘的值不會返回正確的信息。具體可以使用的值能夠查看 W3C 的 SOAP 文檔。這樣,在客戶端提供無效的產品代碼時,會捕獲到的異常信息:編程語言
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