Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP SoapFault未被异常处理程序捕获_Php_Soap_Exception Handling - Fatal编程技术网

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

PHP SoapFault未被异常处理程序捕获,php,soap,exception-handling,Php,Soap,Exception Handling,我不熟悉PHP异常处理和SOAP。由于某种原因,我不能抓住一个错误。我不知道为什么。soap服务器不是我的 try { $contact_id = $objSoapClient->getContactIdFromVisitorId('12345'); } catch (SoapFault $sf) { echo "Soapfault"; } catch (Exception $e) { echo "Exception"; } 我故意把坏身份证1234

我不熟悉PHP异常处理和SOAP。由于某种原因,我不能抓住一个错误。我不知道为什么。soap服务器不是我的

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

我故意把坏身份证12345传过去。启用错误时,我会看到以下消息
SoapFault异常:[SOAP-ENV:Client]无效的访问者ID
。然而,我的catch-SoapFault块和catch-Exception块从未被命中。为什么?

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

话虽如此,如果代码位于定义名称空间的类内,那么代码将无法工作,因为它将尝试将异常引用为\namespace\Exception,而该异常不存在。“被动”引用是允许的,例如
catch
子句或
instanceof
表达式中的引用,因为丢失的类可以稍后加载

为了让它工作,您必须在类名前面加一个斜杠(即.\Exception),告诉PHP从全局空间使用PHP(如果您想这样称呼它,也可以从根空间使用PHP),而不是从名称空间使用PHP

<?php

namespace test;

class Foo
{
  public function bar()
  {
    try
    {
      something_that_might_break();
    }
    catch (\Exception $e)
    {
      // this will work
    }
  }
}

?>


您可以在这里找到许多有关名称空间的信息:。

问题原来是我的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 
));
$objSoapClient=new-SoapClient('https://mywebservice.com/foo.wsdl,数组(
“trace”=>false,
“异常”=>true,//“用户名”,//“用户名”
'密码'=>'密码',//密码
'features'=>SOAP\单元素\数组+SOAP\使用\ XSI\数组\类型
));

您的函数getContactIdFromVisitorId是否引发异常?我假设是这样,因为当我启用错误时,我看到问题末尾包含的SoapFault异常错误消息
[SOAP-ENV:Client]无效的访问者ID
我要补充的是,web服务似乎正在向变量
$contact\u ID
返回一个实际的SoapFault对象,这就是我的soap异常未被破坏的原因。谢谢你,笨蛋!再次被名称空间挫败!我对Java和静态类型有了新的认识!谢谢你。这也让我感动。我无法想象为什么默认行为是隐藏异常。