2011-08-06 15 views
20

Si consideri il seguente codice C++:L'eccezione generata nel blocco di cattura verrà catturata da blocchi di blocco successivi?

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

mi aspetto la risposta è no, dato che non è all'interno del blocco try e vedo in un'altra domanda la risposta è no per Java, ma vuole confermare C++ è anche no. Sì, posso eseguire un programma di test, ma mi piacerebbe conoscere la definizione della lingua del comportamento nel caso remoto che il mio compilatore ha un bug.

risposta

21

No. Solo le eccezioni generate nel blocco try associato possono essere catturate da un blocco catch.

7

No, non lo farà, Un blocco catch catching verso l'alto della gerarchia sarà in grado di catturarlo.

Esempio Esempio:

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

Dovrebbe migliorare la risposta che 'bar (2)' sarà preso in blocco cattura k nella funzione 'main()'. Ciò renderà la risposta più chiara. – zar

2

No, un blocco catch gestisce l'eccezione più vicino, quindi se si tenta ... catch (Exception & exc) ... catch (SomethingDerived & derivedExc) l'eccezione sarà trattati in blocco & exc

si potrebbe ottenere il comportamento desiderato per delega un'eccezione al metodo chiamante

Problemi correlati