2011-06-23 13 views
10

Estoy anidando en las capturas de prueba dentro de una declaración de captura principal, lo que me gustaría saber es cómo puedo hacer que la captura principal no funcione si uno de los intentos de captura anidados falla?Cómo pasar la excepción atrapada en la captura interna a la captura externa en una captura de intento anidada

Aquí está mi código:

try 
{  
    try 
    { 
     //how can I make the main try catch fail if this try catch fails? 
    } 
    catch(Exception $e) 
    { 
     error_log(); 
    }  
} 
catch(Exception $e) 
{ 
    error_log(); 
} 

Respuesta

18

Después error_log(); en el primer try-catch, el tipo throw $e; (en una nueva línea). Esto arrojará el error nuevamente, y el try-catch externo lo manejará.

2

Dentro de la captura interna, throw() - NO recomendado, he visto varios problemas con PHP al hacer esto. O establece una bandera para lanzar justo después de la captura interna.

Aquí hay un ejemplo que arroja la misma excepción (o puede lanzar una diferente).

try { 
    $ex = null; 
    try { 
     //how can I make the main try catch fail if this try catch fails? 
    } catch(Exception $e){ 
     $ex = $e; 
     error_log(); 
    } 

    if ($ex) { 
     throw $ex; 
    } 

} catch(Exception $e){ 
    error_log(); 
} 
0

uso de una variable bool y la palabra clave "retorno" en el lugar apropiado podría hacer el truco para usted ...

+1

el punto es para transferir el control a la 'catch' exterior después de ejecutar la interior. Un 'return' se saltaría por completo. – cHao

5

debe ampliar Excepción para los diversos tipos diferentes de Excepción. De esa manera puede desencadenar un bloque específico try-catch:

try 
{ 
    ... 
    try 
    { 
    throwSomeException(); 
    } 
    catch (InnerException $e) 
    { 
    ...do stuff only for InnerException... 
    } 
    ... 
} 
catch (Exception $e) 
{ 
    ...do stuff for all types of exception... 
} 

Además, puede encadenar sus catch declaraciones para desencadenar diferentes bloques en un solo try-catch:

try 
{ 
    ... 
} 
catch (SpecificTypeOfException $e) 
{ 
    ..do something specific 
} 
catch (TypeOfException $e) 
{ 
    ..do something less specific 
} 
catch (Exception $e) 
{ 
    ..do something for all exceptions 
} 
0

puedo manejar excepciones en un manera similar a eventHandling en Javascript. Un evento sube de escala de específico a genérico. Cuando llega al programa de inicio, una excepción pierde todo el significado del código y simplemente debe atraparse para iniciar sesión y finalizar una aplicación.

Mientras tanto, un montón de cosas puede suceder

CallStack:

  • Inicio almuerzo
  • Coma Apple (Antes de este código, una manzana fue comprado como el almuerzo)
  • dientes se hunden en manzana

Durante mi consumo de la manzana, un gusano apareció:

throw NausiaException('I found a bleeding worm...'); 

Coma alcance de Apple atrapa

catch(Exception $e) 

la excepción ya que en ese ámbito se puede devolver a la niña a la tienda y gritar a la gerente. Como no se puede decir nada más útil sobre la incidencia, se llama a

throw $e 

porque se produjo un error al comer la manzana.

Algo podría haber ido diferente Sin embargo, si el gerente de la tienda se negó a la devolución, se puede envolver la excepción

throw new RefundFailedException('The manager is a cheap skate', RefundFailedException::REFUSED, $e) 

almuerzo de inicio Alcance inicio alcance el almuerzo quiere tirar mal el almuerzo

try { 
    //Start lunch 
} catch (Exception $e) { 
    switch (true) { 
     case $e instanceof NausiaException: 
     case $e instanceof RefundFailedException: 
      //Throw lunch away 
      break; 
    } 
} 
Cuestiones relacionadas