PHP SoapFault не пойман обработчиками исключений

Я новичок в обработке исключений PHP и SOAP. По какой-то причине я не могу поймать SoapFault. Я не знаю почему. Мыльный сервер не мой.

try { 
    $contact_id = $objSoapClient->getContactIdFromVisitorId('12345');
} 
catch (SoapFault $sf) { 
    echo "Soapfault"; 
} 
catch (Exception $e) { 
    echo "Exception"; 
}

Я намеренно передаю неверный идентификатор 12345. Когда я включаю ошибки, я вижу следующее сообщение SoapFault exception: [SOAP-ENV:Client] Invalid Visitor ID. Тем не менее, мой блок блокировки SoapFault и мой блок исключения Exception когда-либо попадают. Почему?

Ответ 1

Проблема оказалась моей декларацией 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 
));

Ответ 2

Код, который вы отправили, выглядит правильно. Вот единственное, что приходит мне на ум.

С учетом сказанного, если код находится внутри класса, который определяет пространство имен, код не будет работать, поскольку он попытается ссылаться на 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.