2009-06-11 17 views
11

In C++ throw; quando eseguito all'interno di un blocco di cattura rilancia l'eccezione attualmente rilevata all'esterno del blocco.Cosa succede se un lancio; la dichiarazione viene eseguita al di fuori del blocco catch?

In this answer un'idea di eccezione dispatcher viene portata come una soluzione per ridurre la duplicazione del codice utilizzando la gestione delle eccezioni complesso spesso:

try { 
    CodeThatMightThrow(); 
} catch(...) { 
    ExceptionHandler(); 
} 

void ExceptionHandler() 
{ 
    try { 
     throw; 
    } catch(FileException* e) { 
     //do handling with some complex logic 
     delete e; 
    } catch(GenericException* e) { 
     //do handling with other complex logic 
     delete e; 
    } 
} 

gettando un puntatore o un valore non fa alcuna differenza quindi è fuori della domanda.

Cosa succede se ExceptionHandler() non viene richiamato da un blocco catch?

ho provato questo codice con VC7:

int main(int, char**) 
{ 
    try { 
     throw; 
    } catch(...) { 
     MessageBox(0, "", "", 0); 
    } 
    return 0; 
} 

In primo luogo fa sì che il debugger per indicare un eccezione first-chance, poi subito un'eccezione non gestita. Se eseguo questo codice all'esterno del debugger, il programma si blocca nello stesso modo in cui è stato chiamato abort().

Qual è il comportamento previsto per tali situazioni?

+0

Tag "windows" rimosso perché non ha nulla a che fare con Windows (ma È una buona domanda). –

risposta

23

Dal standard, 15,1/8

Se è attualmente gestita non fa eccezione, l'esecuzione di un rimessa espressione senza operando chiamate std::terminate().

+0

Solo perché a) mi hai battuto e b) hai quotato lo standard eliminerò la mia (quasi) risposta duplicata – Glen

Problemi correlati