PHP SoapFault未被异常处理程序捕获
我不熟悉PHP异常处理和SOAP。由于某种原因,我不能抓住一个错误。我不知道为什么。soap服务器不是我的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
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和静态类型有了新的认识!谢谢你。这也让我感动。我无法想象为什么默认行为是隐藏异常。