我使用laravel框架,我想检查到Soap服务器的连接是否成功,而应用程序不会死于致命错误。
这两种情况:
$this->client = @new SoapClient("http://some.url/test.wsdl");
$this->session = $this->client->login("username", "password");
if (is_soap_fault($this->session)) {
return "Error";
}还有这个:
try {
$this->client = @new SoapClient("http://some.url/test.wsdl");
$this->session = $this->client->login("username", "password");
} catch (SoapFault $e) {
return "Error";
}导致致命错误:
Symfony \ Component \ Debug \ Exception \ FatalErrorException
SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://some.url/test.wsdl' : failed to load external entity "http://some.url/test.wsdl"谢谢
发布于 2015-07-06 20:58:01
我今天也在这个问题上苦苦挣扎。问题是Laravel错误处理程序将这个可捕获的错误解释为致命错误,并因此中止程序。
为了应对这种情况,您需要在Laravel的内部错误处理程序之前拦截错误。根据您的Laravel版本,此方法会有所不同:
Laravel 4.*
globals.php文件。这应该在您的app\start\文件夹中。App::fatal(function($exception) {//如果发现SOAP错误,我们不想致命地崩溃,而是在以下情况下捕获它:(strpos($exception->getMessage(),'SOAP- Error ') !== FALSE) { '';} });
Laravel 5.*
globals.php文件。所有IoC呼叫都通过ServiceProviders处理。转到app\Providers\AppServiceProvider.php.render(),在return parent::render($request, $e);之前执行以下代码这将从错误处理程序中删除SoapFault错误类型。记住捕捉SoapFault,因为Laravel不会!
发布于 2018-02-05 21:29:06
试试这个:
try {
$this->client = @new SoapClient("http://some.url/test.wsdl");
$this->session = $this->client->login("username", "password");
} catch (\Throwable $e) {
return "Error";
}发布于 2018-05-01 00:48:59
解决方案实际上是要求Soap客户端抛出一个SoapFault,而不是报告一个E_ERROR。
当Soap客户端报告E_ERROR时,您不需要捕获任何东西。
要解决这个问题,可以像这样初始化你的SoapClient:
$clientOptions = array(
'exceptions' => true,
);
try {
$client = new \SoapClient("foo.wsdl", $clientOptions);
} catch (\SoapFault $e) {
// Do what you need to do!;
}
try {
$result = $client->__soapCall($method, $data);
} catch (\SoapFault $e) {
// Do what you need to do!;
}https://stackoverflow.com/questions/25935303
复制相似问题