2014-03-12 11 views
13

ist hier von http://www.tutorialspoint.com/cplusplus/cpp_exceptions_handling.htmthrow() nach Funktionsdeklaration in C++ Ausnahmestruktur?

#include <iostream> 
#include <exception> 
using namespace std; 

struct MyException : public exception 
{ 
    const char * what() const throw() 
    { 
    return "C++ Exception"; 
    } 
}; 

verstehe ich die const nach what bedeutet, dass die Funktion keine Mitglieder der Struktur nicht verändert, aber was die throw() am Ende bedeutet?

+0

Tangential: gegeben "C++ Exception" ist funktionslokal und hat automatischen Speicher, könnte what() 'std :: badalloc 'werfen, wenn Sie nicht genügend Arbeitsspeicher hatten? – RJFalconer

+0

@rjfalconer Warum denkst du, dass das automatische Speicher hat? Der Rückgabewert des unbenannten Zeigers tut es, aber das Array? – Yakk

+0

Ah ja. Ich ignoriere den Rückgabetyp. Also die selbe Frage dann aber für jedes beliebige Beispiel wo der automatische Speicher verwendet wird: würde das die Verwendung eines solchen Ausnahme-Spezifizierers verbieten? – RJFalconer

Antwort

18

Es bedeutet, dass es keine Ausnahmen werfen. Dies ist ein wichtiger Garant für eine Funktion wie what, die in der Regel in Ausnahmebehandlung aufgerufen wird: Sie müssen nicht eine andere Ausnahme ausgelöst werden soll, während Sie versuchen, eine zu behandeln.

In C++ 11 sollten Sie stattdessen noexcept verwenden. Die alte throw-Spezifikation ist veraltet.

3

Sie den Typ angeben geworfen, so dass, wenn er wirft alles aber diese Art (z int), dann ist die Funktion aufruft std::unexpected stattdessen für einen Handler suchen oder std::terminate aufrufen.

In diesem Fall werden keine Ausnahmen ausgelöst, was für what() wichtig ist.

Wenn dieser Werbespezifikator ohne Typ leer ist, bedeutet dies, dass für jede Ausnahme aufgerufen wird. Funktionen ohne throw specifier (reguläre Funktionen) nie aufrufen, aber folgen der normale Pfad der Suche nach ihrer Ausnahmebehandlung.

Dies wird dynamische Ausnahmespezifikationen genannt und es war üblich in älteren Code. Es gilt als veraltet.

Siehe hier: http://www.cplusplus.com/doc/tutorial/exceptions/

7

throw() ist eine Ausnahme-Spezifizierer, der erklärt, dass what() nie eine Ausnahme werfen. Dies ist jedoch in C++ 11 veraltet (siehe http://en.wikipedia.org/wiki/C++11). Um anzugeben, dass eine Funktion keine Ausnahme auslöst, existiert das Schlüsselwort noexcept in C++ 11.

Verwandte Themen