PHP SoapFault没有被异常处理程序捕获

mrt*_*man 14 php soap exception-handling

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

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

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

Fra*_*nes 30

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

话虽如此,如果代码位于定义命名空间的类中,则代码将无法工作,因为它将尝试将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
    }
  }
}

?>
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到有关命名空间的大量信息:http://php.net/manual/en/language.namespaces.php.


mrt*_*man 27

问题原来是我的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 
));
Run Code Online (Sandbox Code Playgroud)

  • 这次真是万分感谢。这也让我着迷。我无法想象为什么默认行为是隐藏异常。 (2认同)