Я новичок в обработке исключений PHP и SOAP. По какой-то причине я не могу поймать SoapFault. Я не знаю почему. Мыльный сервер не мой.
try { $contact_id = $objSoapClient->getContactIdFromVisitorId('12345'); } catch (SoapFault $sf) { echo "Soapfault"; } catch (Exception $e) { echo "Exception"; }
Я намеренно SoapFault exception: [SOAP-ENV:Client] Invalid Visitor ID
идентификатор 12345. Когда я SoapFault exception: [SOAP-ENV:Client] Invalid Visitor ID
ошибки, я вижу следующее сообщение SoapFault exception: [SOAP-ENV:Client] Invalid Visitor ID
. Тем не менее, мой блок блокировки SoapFault и мой блок исключения Exception когда-либо попадают. Зачем?
Код, который вы отправили, выглядит правильно. Вот единственное, что приходит мне на ум.
При этом, если код находится внутри класса, который определяет пространство имен, код не будет работать, поскольку он попытается ссылаться на Exception как \ namespace \ Exception, который не существует. «Пассивные» ссылки, такие как те, которые содержатся в предложениях catch
или instanceof
, разрешены, потому что недостающий класс может быть загружен позже.
Чтобы он работал, вы должны префикс имени класса слэш (т.е. \ Exception), чтобы сообщить PHP, что PHP использует глобальное пространство (или root, если вы хотите назвать это) (PHP), в отличие от вашего пространства имен;
<?php namespace test; class Foo { public function bar() { try { something_that_might_break(); } catch (\Exception $e) { // this will work } } } ?>
Здесь вы можете найти много информации о пространствах имен: http://php.net/manual/en/language.namespaces.php .
Проблема оказалась моей декларацией SoapClient. Для исключения исключений должен быть установлен параметр исключения.
$objSoapClient = new SoapClient('https://mywebservice.com/foo.wsdl', array( "trace" => false, "exceptions" => true, // <-------------- This!!! 'login' => 'username', //username 'password' => 'password', //password 'features' => SOAP_SINGLE_ELEMENT_ARRAYS + SOAP_USE_XSI_ARRAY_TYPE ));