2010-06-17 24 views
7

Ich habe einige technische Fragen. In dieser Funktion:Was passiert, wenn ich eine Ausnahme erstelle?

string report() const { 
    if(list.begin() == list.end()){ 
     throw "not good"; 
    } 
    //do something 
} 

Wenn ich die Ausnahme werfe, was mit dem Programm los ist? Wird meine Funktion beendet oder wird sie weiter ausgeführt? Wenn es endet, welchen Wert wird es zurückgeben?

+8

Was muss Ihr C++ Lehrbuch dazu sagen? –

Antwort

11

Wenn Sie eine Ausnahme auslösen, werden alle Funktionen bis zu dem Punkt zurückversetzt, an dem ein try...catch Block mit einem übereinstimmenden Typ catch gefunden wird. Wenn Ihre Funktion nicht innerhalb eines try-Blocks aufgerufen wird, wird das Programm mit einer nicht behandelten Ausnahme beendet.

Auschecken https://isocpp.org/wiki/faq/exceptions für weitere Informationen.

3

Ihre Funktion wird sofort beendet und es wird nichts zurückgegeben. Wenn keine Catch-Anweisungen die Ausnahme "in der Anrufkette" abfangen, wird Ihre Anwendung beendet.

6

Es wird im Grunde den Stapel hinaufgehen, bis es einen Ausnahmebehandler findet; Wenn es das Ende des Stapels erreicht, ohne einen zu finden, stürzt Ihr Programm ab. Wenn einen findet, wird der Stapel an diesem Punkt zurückgespult, der Handler ausgeführt und mit dem Code nach dem Handler-Block fortgefahren, egal wie weit der Stack entfernt ist.

Sie können alle Arten von Details über C++ Exception Handling-Mechanismus durch Google erhalten. Here's a head start.

1

Es wird nicht zurückkehren, es wird tatsächlich beendet und erreicht den "nächsten" (Call-Stack-weise) try...catch Block. Wenn keine gefunden wird, die meiste Zeit das Programm gerade beendet, auf einigen Plattformen kann der Fehler gedruckt werden, ich kenne die Besonderheiten davon nicht (und höchstwahrscheinlich nur diejenigen, die von std :: exception abgeleitet sind).

4

Da Sie die Ausnahme nicht im Kontext der Funktion abfangen, wird die Funktion beendet und der Stapel wird abgewickelt, wenn nach einem Ausnahmebehandler gesucht wird (ein catch-Block, der einer Zeichenfolge oder dem generischen Catch entspricht) (...)). Wenn es keinen findet, wird Ihr Programm beendet.

+0

+1 für einschließlich der Erwähnung der Abwicklung. enthält Dinge wie zugewiesene Objekte werden Destruktoren aufgerufen haben. –

+0

Das Abwickeln des Stapels beginnt erst, nachdem ein Fangblock gefunden wurde. – orodbhen

Verwandte Themen