Я звоню во внешнюю службу в соответствии с их 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 включен. Я проверил, это не так.
Хорошо, я понял это. Это разрешило это для меня:
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. Но я думаю, что только мое мнение