如何让 SoapClient 更优雅地失败?
how to get SoapClient to fail more gracefully?
我正在根据他们的 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。我该怎么做?
我阅读了一些关于 bug/issue 启用 xdebug 时的注意事项。我查了一下,不是。
好的,我明白了。这为我解决了:
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 作为证据)但是 'exceptions' 设置为 1 它应该这样做......抛出一个例外,不是致命的。从 php 的角度来看,网络错误永远不会被认为是致命的。但我想这只是我的意见
我正在根据他们的 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。我该怎么做?
我阅读了一些关于 bug/issue 启用 xdebug 时的注意事项。我查了一下,不是。
好的,我明白了。这为我解决了:
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 作为证据)但是 'exceptions' 设置为 1 它应该这样做......抛出一个例外,不是致命的。从 php 的角度来看,网络错误永远不会被认为是致命的。但我想这只是我的意见