如何让SoapClient更优雅地失败?

时间:2015-11-10 05:22:40

标签: php error-handling soap-client

我按照API调用外部服务:

            $client = new SoapClient($this->apiUrl, array(
            'trace' => 1,
            'exceptions' => 1,
            'encoding' => 'UTF-8'
        ));

它工作得很好......但后来我故意将apiUrl搞砸到一个无效的地址,我很震惊地看到服务器500错误,这在我的日志中:

[09-Nov-2015 22:10:07 MST] PHP Fatal error:  SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://fakeaddress.com/wsdl' : failed to load external entity "http://fakeaddress.com/wsdl"
in /home/account/public_html/test/test.php on line 171
[09-Nov-2015 22:10:08 MST] PHP Fatal error:  Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://fakeaddress.com/wsdl' : failed to load external entity "http://fakeaddress.com/wsdl"
in /home/account/public_html/test/test.php:171

那不好。如果该网站由于某种原因而关闭,我需要处理错误,而不仅仅是向用户显示500.我该怎么做?

我在启用xdebug时阅读了有关错误/问题的几个注释。我查了一下,不是。

1 个答案:

答案 0 :(得分:0)

好吧,我明白了。这解决了我的问题:

        try {
            $client = @new SoapClient($this->apiUrl, array(
                'trace' => 1,
                'exceptions' => 1,
                'encoding' => 'UTF-8'
            ));
        } catch (SoapFault $E) {

            //CODE TO RUN IF ERROR OCCURS GOES HERE

        }

虽然我不能说为什么包装在try / catch中,但确实如此。我相信这确实是一个错误,虽然php坚持认为它不是(使用这个try / catch作为证据),但是有例外情况'设置为1它应该做到这一点...抛出异常,而不是致命的。从php的角度来看,网络错误永远不会被认为是致命的。但我想这只是我的意见