2011-08-06 10 views
20

Consideremos el siguiente código C++:¿La excepción lanzada en el bloque de catch será atrapada por bloques catch posteriores?

try { 
    throw foo(1); 
} catch (foo &err) { 
    throw bar(2); 
} catch (bar &err) { 
    // Will throw of bar(2) be caught here? 
} 

Yo esperaría que la respuesta es no, ya que no está dentro del bloque de try y veo en otra pregunta la respuesta es no para Java, pero quiere confirmar C++ es también no. Sí, puedo ejecutar un programa de prueba, pero me gustaría saber la definición de lenguaje del comportamiento en el caso remoto de que mi compilador tenga un error.

Respuesta

21

No. Solo las excepciones lanzadas en el bloque asociado try pueden ser atrapadas por un bloque catch.

7

No, no lo hará, un bloque de captura adjunto hacia arriba la jerarquía podrá atraparlo.

Ejemplo de la muestra:

void doSomething() 
{ 
    try 
    { 
     throw foo(1); 
    } 
    catch (foo &err) 
    { 
     throw bar(2); 
    } 
    catch (bar &err) 
    { 
     // Will throw of bar(2) be caught here? 
     // NO It cannot & wont 
    } 
} 

int main() 
{ 
    try 
    { 
     doSomething(); 
    } 
    catch(...) 
    { 
     //Catches the throw from catch handler in doSomething() 
    } 
    return 0; 
} 
+1

debería mejorar la respuesta que 'barra (2)' se verá atrapado en el bloque de captura k en la función 'main()'. Esto hará que la respuesta sea más clara. – zar

2

No, un bloque Catch controla la excepción más cercana, por lo que si se intenta ... catch (Exception exc &) ... catch (SomethingDerived & derivedExc) la excepción será manejado en el bloque & exc

Usted podría conseguir el comportamiento deseado por delegación excepción al método de llamada

Cuestiones relacionadas