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

2022-08-30 20:17:55

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

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

我故意通过错误的ID 12345。当我启用错误时,我看到以下消息。但是,我的捕获 SoapFault 块和我的捕获异常块都会被击中。为什么?SoapFault exception: [SOAP-ENV:Client] Invalid Visitor ID


答案 1

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

话虽如此,如果代码位于定义命名空间的类中,则代码将无法正常工作,因为它将尝试将 Exception 引用为 \namespace\Exception,而该属性不存在。允许使用“被动”引用(如子句或表达式中的引用),因为以后可能会加载缺少的类。catchinstanceof

为了让它工作,你必须在类名前面加上一个斜杠(即\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


答案 2

问题原来是我的 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 
));

推荐