|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2005-09-27 14:32 UTC] gareth at wsys dot co dot uk
Description:
------------
When using the SOAP Client, it normally throws a catchable SoapFault exception. This helps to elegantly fail if there is a problem with a Web Service.
However, if the problem occurs when loading the WSDL, it throws a PHP Fatal Error, which cannot be caught.
This means that if you want to use a web service in a web application, you cannot handle the error (e.g. there is network congestion, or the server hosting the web service goes down).
Is this intentional, I am not sure.
If it is intentional (and I hope not given the fact that you are requesting information from a completely different server, not under your control), any chance this can be changed to throw either a SoapFault Exception, or just something that can be caught?
Reproduce code:
---------------
try {
$sc = new SoapClient("some.wsdl", array());
} catch (Exception $e) {
echo 'Error Caught';
}
Expected result:
----------------
Error Caught
Actual result:
--------------
Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from '{URL Removed}'
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 13:00:01 2025 UTC |
OK, the debug information shows that the Soap client class is now throwing an uncaught SoapFault exception (which causes the fatal error). with a try{ } catch(SoapFault $exception) I can continue the script. I've closed the bug.I can reproduce this error with php 5.1.4 and 5.2.0 on windows. And it seems Derick was also able to reproduce it on Linux. Using the following we get 3 warnings and a fatal error: <?php try { $client = new SoapClient('http://i_dont_exist.com/some.wsdl'); } catch (SoapFault $e) { var_dump(get_class($e)); } catch (Exception $e) { var_dump(get_class($e)); } var_dump($client); It really should not do anything but throw an exception, as this is what is defined to happen for fatal errors in constructors for all extensions.Similar problem here with PHP 5.1.6. try { $soap = new SoapClient('[...]', array('exceptions' => true)); // Note: Same results without or without exceptions => true } catch(Exception $e) { var_dump($e); } Results in: Warning: SoapClient::__construct([...]) [function.SoapClient---construct]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in [...] Warning: SoapClient::__construct() [function.SoapClient---construct]: I/O warning : failed to load external entity "..." in [...] Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from '[...]' in [...]5.2.2-dev as of today (and 5.2.1) on windows is not raising a SoapFault exception regardless of if exceptions is true or false, as stated by jhendric. However, 5.2.1 on FreeBSD 4 (installed from ports) is raising an uncaught SoapFault exception as was stated by gareth . So it appears to be platform specific. In both cases, 3 additional warnings are raised. IIS: Warning: SoapClient::SoapClient(): php_network_getaddresses: getaddrinfo failed: No such host is known. in c:\web\test.php on line 2 Warning: SoapClient::SoapClient(h^tp://some.random.host/test.wsdl): failed to open stream: No such file or directory in c:\web\test.php on line 2 Warning: SoapClient::SoapClient(): I/O warning : failed to load external entity "h^tp://some.random.host/test.wsdl" in c:\web\test.php on line 2 Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'h^tp://some.random.host/test.wsdl' in c:\web\test.php on line 2 FreeBSD 4: Warning: SoapClient::SoapClient(): php_network_getaddresses: getaddrinfo failed: No address associated with hostname in /usr/home/www/test.php on line 2 Warning: SoapClient::SoapClient(h^tp://some.random.host/test.wsdl): failed to open stream: Unknown error: 0 in /usr/home/www/test.php on line 2 Warning: SoapClient::SoapClient(): I/O warning : failed to load external entity "h^tp://some.random.host/test.wsdl" in /usr/home/www/test.php on line 2 Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'h^tp://some.random.host/test.wsdl' in /usr/home/www/test.php:2 Stack trace: #0 /usr/home/www/test.php(2): SoapClient->SoapClient('h^tp://some.ran...') #1 {main} thrown in /usr/home/www/test.php on line 2 Note: had to replace http due to spam filter.Work around: try { if(!@file_get_contents($wsdl)) { throw new SoapFault('Server', 'No WSDL found at ' . $wsdl); } $soap = new SoapClient($wsdl); // ... } catch(SoapFault $e) { // ... }