Come già detto, è possibile, ma bisogna vedere il 'cadere-through '-schema in questo. Se nel primo try-catch-block viene rilevata l'eccezione, questa non verrà catturata dal blocco catch esterno. Tuttavia, se non viene catturato dal blocco catch interno, cercherà di trovare un gestore di eccezioni corrispondente nel catch-block esterno.
È anche possibile aumentare in modo esplicito l'eccezione al successivo gestore di eccezioni utilizzando throw;
nel gestore di eccezioni interno.
Per esempio questo codice:
try
{
try
{
throw std::runtime_error("Test");
}
catch (std::runtime_error& e)
{
std::cerr << "Inner Exception-Handler: " << e.what() << std::endl;
throw;
}
}
catch (std::exception& e)
{
std::cerr << "Outer Exception-Handler: " << e.what() << std::endl;
}
si tradurrà in:
Inner Exception-Handler: Test
Outer Exception-Handler: Test
Questo funziona perché std::runtime_error is derived from std::exception. Dovresti anche notare che in un esempio così banale è anche possibile scrivere i blocchi di cattura l'uno dopo l'altro, ma se vuoi eseguire altro codice dopo il primo catch-block dovrai nidificarli.
fonte
2009-02-16 15:09:06
Devi solo amare queste persone che pensano di essere più intelligenti di chiunque altro e pensano di possedere questo sito web –
Solitamente questo tipo di domande mi dà il beneficio del dubbio: solo perché funziona sul tuo compilatore non significa che sia parte dello standard. Il contrario è anche vero. – rmeador
@shoosh questa domanda mi ha salvato almeno 90 secondi dalla ricerca! –