PHP SoapFault не перехватывается обработчиками исключений - PullRequest
14 голосов
/ 16 июня 2011

Я новичок в обработке исключений 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.Тем не менее, мой блок catch SoapFault и мой блок catch Exception никогда не попадают в цель.Почему?

Ответы [ 2 ]

27 голосов
/ 16 июня 2011

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

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

24 голосов
/ 16 июня 2011

Проблема оказалась в моей декларации 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 
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...