如何在php Soap Client请求期间处理多个SOAP错误?

时间:2012-07-26 23:21:30

标签: php soap-client soapfault soapexception

我有兴趣通过php的soapClient拨打肥皂电话到网络服务,从监控站获取水位。我想处理执行期间发生的两个soapfaults。第一个错误如下:

SoapFault exception: [soapenv:Server.userException] java.rmi.RemoteException: We are sorry, but no data is available from this station at this time in C:\xampp\htdocs\NOAA\LogWriter.php:214 Stack trace: #0 C:\xampp\htdocs\NOAA\LogWriter.php(214): SoapClient->__soapCall('getWaterLevelRa...', Array, Array) #1 C:\xampp\htdocs\NOAA\LogWriter.php(188): getLevel('8531680', '20120726 15:19') #2 {main}

如果某段时间的数据不可用,预计在脚本期间会多次出现此错误。我需要抓住这个错误,以告诉脚本再次尝试新的时间。我用了一个catch块来做这件事。

如果webservice没有加载wsdl文件或者服务器超时,我还需要捕获第二个错误。为了测试这个,给我的脚本一个错误的位置,以产生我之前收到的相同错误,它如下:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://opendap.co-ops.nos.noaa.gov/axis/services/WaterLevelRawOneMin?wsdl' : Extra content at the end of the document in C:\xampp\htdocs\NOAA\LogWriter.php:210 Stack trace: #0 C:\xampp\htdocs\NOAA\LogWriter.php(210): SoapClient->SoapClient('http://opendap....', Array) #1 C:\xampp\htdocs\NOAA\LogWriter.php(171): getLevel('8531680', '20120726 12:35') #2 {main} thrown in C:\xampp\htdocs\NOAA\LogWriter.php on line 210  

第二个错误仍未被捕获并终止我的脚本。但是我需要抓住它并显示一条消息。

我已经发布了我的php函数,可以在下面调用soap。

有人可以就如何做到这一点给我任何想法吗?

function getLevel($id, $date) {

    $client = new SoapClient("http://opendap.co-ops.nos.noaa.gov/axis/services/WaterLevelRawOneMin?wsdl", array('trace' => false));

    $Parameters = array("stationId" => $id, "beginDate" => $date, "endDate" => $date, "datum" => "MLLW",
                        "unit"      => 1, "timeZone" => 1);

    try {
        return $client->__soapCall(
            "getWaterLevelRawOneMin", array('Parameters' => $Parameters),
            array('location' => "http://opendap.co-ops.nos.noaa.gov/axis/services/WaterLevelRawOneMin")
        );
    } catch (SoapFault $e) {
        if (
            $e->faultcode == "soapenv:Server.userException"
            and $e->faultstring == "java.rmi.RemoteException: We are sorry, but no data is available from this station at this time"
        ) {
            return "FAULT";
        } else {
            echo "Could not connect to the server";
        }
    } // end of catch blocK
}// end of function

1 个答案:

答案 0 :(得分:1)

只有当您调用SoapClient :: constructor

时,才会发生有关损坏的WSDL的异常
try {
    $client= new SoapClient($wsdlUrl ,array('trace'=>false));
}catch(Exception $e) {
    // your loging regarding this case 
}

当您完成所有Web服务时,可能会发生SoapFault异常:

try {
    $client= new SoapClient($wsdlUrl ,array('trace'=>false));
    try {
       return $client->_call('....');
    } catch (SoapFault $sp) {
        //your logic rearding soap fault 
    }
}catch(Exception $e) {
    // your loging regarding this case 
}
return false;