2009-06-11 7 views
11

In C++ throw; wenn innerhalb eines catch-Blocks ausgeführt wird, wiederholt die aktuell gefangene Ausnahme außerhalb des Blocks.Was passiert, wenn ein Wurf; Anweisung wird außerhalb des Catch-Blocks ausgeführt?

In this answer eine Idee von Ausnahme Dispatcher als Lösung Doppelarbeit zu reduzieren Code gebracht, wenn oft komplexe Ausnahmebehandlung mit:

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; 
    } 
} 

Werfen einen Zeiger oder einen Wert macht keinen Unterschied, so dass es aus ist der Frage.

Was passiert, wenn ExceptionHandler() nicht von einem catch-Block aufgerufen wird?

habe ich versucht, diesen Code mit VC 7:

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

Zuerst es bewirkt, dass der Debugger eine erste Chance Ausnahme anzuzeigen, dann sofort eine nicht behandelte Ausnahme. Wenn ich diesen Code außerhalb des Debuggers laufe, stürzt das Programm genauso ab als wenn abort() aufgerufen würde.

Was ist das erwartete Verhalten für solche Situationen?

+0

Removed "Windows" -Tag, da dies nichts mit Windows zu tun hat (aber ist eine gute Frage). –

Antwort

23

Vom Standard 15,1/8

Wenn keine Ausnahme derzeit gehandhabt wird, einen throw-Ausdruck ohne Operanden ausführt ruft std::terminate().

+0

Nur weil a) du mich dazu geschlagen hast, und b) du den Standard zitiert hast, lösche ich meine (fast) doppelte Antwort – Glen

Verwandte Themen