2011-06-16 11 views
11

Soy nuevo en el manejo de excepciones de PHP y SOAP. Por alguna razón, no puedo atrapar un SoapFault. No sé por qué. El servidor de jabón no es mío.PHP SoapFault no capturado por los manejadores de excepciones

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

estoy pasando a propósito de la mala identificación 12345. Cuando habilito errores que veo el siguiente mensaje SoapFault exception: [SOAP-ENV:Client] Invalid Visitor ID. Sin embargo, mi bloque catch SoapFault y mi bloque Exception catch nunca son golpeados. ¿Por qué?

+0

¿Su función getContactIdFromVisitorId arroja la excepción? –

+0

Supongo que ya que cuando habilito los errores veo el mensaje de error de excepción SoapFault que incluí al final de mi pregunta '[SOAP-ENV: Cliente] ID de visitante no válido – mrtsherman

+0

Agregaré que el servicio web parece estar devolviendo una real SoapFault se opone a la variable '$ contact_id' – mrtsherman

Respuesta

17

El problema resultó ser mi declaración de SoapClient. Hay un parámetro de excepciones que debe establecerse para que se activen las excepciones.

$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 
)); 
+0

gracias por esto. esto también me estaba atrapando. por qué el comportamiento predeterminado sería ocultar excepciones, no me lo puedo imaginar. – Ben

24

Parece que el código que ha enviado es correcto. Esto es lo único que viene a mi mente.

Dicho esto, si el código está ubicado dentro de una clase que define un espacio de nombres, el código no funcionará, ya que tratará de hacer referencia a Exception como \ namespace \ Exception que no existe. Las referencias "pasivas" como las de las cláusulas catch o instanceof se permiten porque la clase faltante podría cargarse más tarde.

Para que funcione, debe marcar el nombre de la clase con una barra inclinada (es decir, \ Exception) para decirle a PHP que use PHP desde el espacio global (o root si así lo quiere llamar) (PHP) como opuesto a tu espacio de nombres;

<?php 

namespace test; 

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

?> 

Usted puede encontrar gran cantidad de información sobre espacios de nombres aquí: http://php.net/manual/en/language.namespaces.php.

+0

Esta fue la razón por la cual las excepciones de mi soap no iban a ser detectadas. Gracias. – Xyon

+1

¡Drat! ¡Frustrado de nuevo por los espacios de nombres! ¡Tengo una nueva apreciación de Java y mecanografía estática! – Chloe

Cuestiones relacionadas