【问题标题】:PHP SoapFault not caught by exception handlers异常处理程序未捕获 PHP SoapFault
【发布时间】:2011-09-16 11:46:07
【问题描述】:

我是 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。但是,我的 catch SoapFault 块和我的 catch Exception 块都不会被击中。为什么?

【问题讨论】:

  • 你的函数getContactIdFromVisitorId是否抛出异常?
  • 我假设是这样,因为当我启用错误时,我看到了问题末尾包含的 SoapFault 异常错误消息[SOAP-ENV:Client] Invalid Visitor ID
  • 我要补充一点,Web 服务似乎正在将一个实际的 SoapFault 对象返回给变量 $contact_id

标签: php soap exception-handling


【解决方案1】:

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

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

【讨论】:

  • 这就是我的肥皂异常没有被捕获的原因。谢谢。
  • 该死!再次被命名空间挫败!我对 Java 和静态类型有了新的认识!
【解决方案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 
));

【讨论】:

  • 谢谢你。这也让我着迷。为什么默认行为是隐藏异常,我无法想象。
猜你喜欢
  • 2011-10-25
  • 2018-05-30
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2018-06-14
  • 1970-01-01
相关资源
最近更新 更多