2010-04-22 7 views
19

Ho appena imbattuto questo codice:cosa "lancia"; fuori da un blocco di cattura?

void somefunction() 
{ 
    throw; 
} 

e mi chiedo: che cosa significa?


Ho taggato la domanda come C++ e Visual C++ perché non conoscevo la risposta. La risposta avrebbe potuto essere correlata allo standard o ad un'estensione speciale di Visual C++ o Visual C++ ignorando lo standard. Ecco perché ho pensato che entrambi i tag fossero giustificati.

+3

Questa domanda non è correlata a Visual Studio o alcun tipo di C++ "visivo". Per favore, non etichettare le domande generiche sul C++ con i tag del framework concreto. –

+0

@Pavel Shved: la domanda potrebbe essere correlata a VC++ se fosse applicabile un tipo di estensione del linguaggio.In tal caso, sarebbe auspicabile rispondere su tale base, pur sottolineando la risposta secondo lo Standard. –

+0

@David, @Tobias, penso che sia meglio non taggare la domanda come correlata al VC se non si è sicuri. La comunità la cambierà in modo appropriato se si tratta di un'estensione di lingua. –

risposta

28

Naturalmente, è possibile che somefunction() venga chiamato solo dall'interno del blocco catch (ad ogni modo, è probabile che sia comunque l'intento).

Se throw; viene eseguito quando un'eccezione non è attiva, chiama terminate() (§15.1/8).

9

Re-getta l'eccezione attualmente attiva. Avrebbe senso solo chiamarlo (possibilmente indirettamente) da un blocco. Questo:

#include <iostream> 
using namespace std; 

void f() { 
    throw; 
} 

int main() { 
    try { 
     try { 
      throw "foo"; 
     } 
     catch(...) { 
      f(); 
     } 
    } 
    catch(const char * s) { 
     cout << s << endl; 
    } 
} 

stampe "foo".

4

Per throw il concetto di blocco di blocco "esterno" o "interno" è definito in termini di runtime, non in termini di compilazione come sembra. Quindi, se durante il runtime il throw viene eseguito nel contesto di runtime di un blocco catch, allora throw funziona come previsto. In caso contrario, viene chiamato terminate().

In effetti, se si osserva più da vicino come vengono definite le eccezioni C++ nelle specifiche del linguaggio, molte cose su di esse sono definite in termini di runtime. A volte sembra anche non simile a C++.

+0

no, I non ha assunto una cosa del genere. Ma non ho commentato abbastanza l'uso della funzione. Scusa per il fraintendimento. –

3

Le persone hanno già spiegato cosa significa, ma è potenzialmente utile sapere perché è possibile vederlo. È un modo utile per costruire un gestore di eccezioni 'generico' che si occupa di eccezioni basate sul loro tipo in modo da ridurre la quantità di codice duplicato.

Quindi, se prendiamo Neil's example ed espandere su ciò che potrebbe fare f() potremmo finire con un'implementazione che fa qualcosa come il mio LogKnownException() funzione che ho proposto in this answer.

Se lavori in una squadra a cui piace registrare tutti i tipi di eccezioni dappertutto, invece di avere un'enorme collezione di blocchi catch in tutti questi punti (o anche peggio una macro) puoi avere un semplice blocco catch che assomiglia a questo

catch(...) 
{ 
    LogKnownException(); 
} 

Anche se mi aspetto che vorrei cambiare il mio precedente esempio di LogKnownException() a uno che semplicemente ha permesso eccezioni che non voleva il login per propagare fuori e continuare in modo non gestita.

Non sto suggerendo che questa sia necessariamente una buona cosa da fare, solo sottolineando che questo è dove è probabile che tu veda il costrutto usato.

Problemi correlati