我是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
。但是,我捕获的SoapFault块和我的捕获异常块都会受到攻击。为什么呢?
答案 0 :(得分:26)
您提交的代码似乎是正确的。这是我唯一想到的。
如上所述,如果代码位于定义命名空间的类中,则代码将无法工作,因为它将尝试将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
}
}
}
?>
您可以在此处找到有关命名空间的大量信息:http://php.net/manual/en/language.namespaces.php。
答案 1 :(得分:24)
问题原来是我的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
));