2011-06-16 14 views
7

Estoy intentando pasar una excepción de un bloque catch específico a un bloque catch más general. Sin embargo, no parece estar funcionando. Aparece un error de servidor 500 cuando intento lo siguiente. ¿Esto es posible?Rethrow php exception into catch catch de nivel superior

Me doy cuenta de que hay soluciones fáciles, pero ¿no es normal decir: "Oye, no tengo ganas de lidiar con este error, hagamos que el controlador de excepciones más general se encargue de eso".

try { 
    //some soap stuff 
} 

catch (SoapFault $sf) { 
    throw new Exception('Soap Fault'); 
} 

catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+0

No, no es normal usar excepciones para controlar el flujo. –

+0

Cool, gracias! – mrtsherman

+4

Quizás la gente necesite revisar las reglas de downvoting. Si lo que está haciendo alguien es una mala idea, entonces explica por qué. Si es una pregunta mal formada, entonces downvote - http://meta.stackexchange.com/questions/33286/downvotes-versus-close-votes-on-questions – mrtsherman

Respuesta

7

Técnicamente esto es lo que está buscando:

try { 
    try { 
     //some soap stuff 
    }  
    catch (SoapFault $sf) { 
     throw new Exception('Soap Fault'); 
    } 
} 
catch (Exception $e) { 
    echo $e->getMessage(); 
} 

sin embargo estoy de acuerdo que las excepciones no deben ser utilizados para el control de flujo. Una mejor manera sería la siguiente:

function show_error($message) { 
    echo "Error: $message\n"; 
} 

try { 
    //some soap stuff 
}  
catch (SoapFault $sf) { 
    show_error('Soap Fault'); 
} 
catch (Exception $e) { 
    show_error($e->getMessage()); 
} 
+2

Hay algunas situaciones en las que necesita volver a lanzar una excepción. Por ejemplo, si tiene un constructor de clase y atrapa dentro de él una excepción (por ejemplo, para registrar el error en un archivo especial), entonces debería volver a lanzar la excepción para informar también al llamante de la construcción sobre el error. – bernhardh