PHP SoapFault未被异常处理程序捕获


PHP SoapFault not caught by exception handlers

我是PHP异常处理和SOAP的新手。由于某种原因,我无法捕获SoapFault。我不知道为什么。肥皂服务器不是我的。

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

我故意把坏id 12345传进来。当我启用错误时,我会看到以下消息SoapFault exception: [SOAP-ENV:Client] Invalid Visitor ID。然而,我的catchSoapFault块和catchException块都不会被命中。为什么?

您提交的代码似乎是正确的。这是我唯一想到的事情。

话虽如此,如果代码位于定义命名空间的类中,则代码将无法工作,因为它将尝试将Exception引用为不存在的''namespace''Exception。"被动"引用(如catch子句或instanceof表达式中的引用)是允许的,因为丢失的类可以稍后加载。

为了让它发挥作用,你必须在类名前面加一个斜杠(即''Exception),告诉PHP从全局空间(或者根,如果你想这么称呼它的话)(PHP)使用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 
));