Namespaces
Variants

try block

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Eine Exception , die in einem try -Block geworfen wird, kann möglicherweise von einem zugehörigen Handler behandelt werden.

Inhaltsverzeichnis

Syntax

try Anweisungsblock Handler-Folge (1)
try Konstruktor-Initialisierer  (optional) Anweisungsblock Handler-Folge (2)
2) Ein Function try Block . compound-statement muss die zusammengesetzte Anweisungskomponente eines Funktionsrumpfs sein.
compound-statement - eine zusammengesetzte Anweisung
handler-seq - eine nicht-leere Sequenz von Handlern
ctor-initializer - Member-Initialisierungsliste (nur für Konstruktoren )

Gewöhnlicher try -Block

Ein gewöhnlicher try -Block ist eine Anweisung .

Wenn eine Ausnahme aus ihrem compound-statement geworfen wird, wird die Ausnahme mit den Handlern in ihrer handler-seq abgeglichen:

void f()
{
    throw 1;     // WIRD NICHT vom Handler unten behandelt
    try
    {
        throw 2; // wird vom zugehörigen Handler behandelt
    }
    catch (...)
    {
        // behandelt die Exception 2
    }
    throw 3;     // WIRD NICHT vom Handler oben behandelt
}

Funktion try -Block

Ein try -Block ist eine spezielle Art von Funktionskörper .

Wenn eine Ausnahme aus ihrem compound-statement oder ctor-initializer (falls vorhanden) geworfen wird, wird die Ausnahme mit den Handlern in ihrer handler-seq abgeglichen:

int f(bool cond)
{
    if (cond)
        throw 1;
    return 0;
}
struct X
{
    int mem;
    X() try : mem(f(true)) {}
    catch (...)
    {
        // behandelt die Ausnahme 1
    }
    X(int) try
    {
        throw 2;
    }
    catch (...)
    {
        // behandelt die Ausnahme 2
    }
};

Ausnahmen, die in Destruktoren von Objekten mit statischer Speicherdauer oder in Konstruktoren von Objekten, die mit Nicht-Block-Variablen mit statischer Speicherdauer assoziiert sind, werden nicht von einem Funktions- try -Block der main -Funktion abgefangen.

Exceptions, die in Destruktoren von Objekten mit Thread-Speicherdauer oder in Konstruktoren von Objekten assoziiert mit non-block Variablen mit Thread-Speicherdauer geworfen werden, werden nicht von einem Funktions- try -Block der initialen Funktion des Threads abgefangen.

(since C++11)

Das Verlassen des Endes der compound-statement eines Handlers eines Funktions- try -Blocks entspricht dem Verlassen des Endes der compound - statement dieses Funktions- try -Blocks, es sei denn, die Funktion ist ein Konstruktor oder Destruktor (siehe unten).

Konstruktor und Destruktor try Block

Für eine Klasse C , wenn der Funktionskörper ihrer Konstruktor- oder Destruktordefinition ein try -Block ist und während der Initialisierung bzw. Zerstörung der Unterobjekte von C eine Exception ausgelöst wird, wird diese Exception ebenfalls mit den Handlern in der Handler-Sequenz  des try -Blocks abgeglichen:

int f(bool cond = true)
{
    if (cond)
        throw 1;
    return 0;
}
struct X
{
    int mem = f();
    ~X()
    {
        throw 2;
    }
};
struct Y
{
    X mem;
    Y() try {}
    catch (...)
    {
        // behandelt die Exception 1
    }
    ~Y() try {}
    catch (...)
    {
        // behandelt die Exception 2
    }
};

Das Verweisen auf ein nicht-statisches Mitglied oder eine Basisklasse eines Objekts im Handler für einen try -Block einer Funktion im Konstruktor oder Destruktor dieses Objekts führt zu undefiniertem Verhalten.

Wenn eine return -Anweisung in einem Handler des try -Blocks eines Konstruktors erscheint, ist das Programm fehlerhaft.

Die aktuell behandelte Exception wird erneut ausgelöst, wenn die Steuerung das Ende eines Handlers des try -Blocks eines Konstruktors oder Destruktors erreicht.

Ablaufsteuerung

Die compound-statement eines try -Blocks ist eine control-flow-limited statement :

void f()
{
    goto label;     // Fehler
    try
    {
        goto label; // OK
        label: ;
    }
    catch (...)
    {
        goto label; // Fehler
    }
}

Eine Sprunganweisung ( goto , break , return , continue ) kann verwendet werden, um die Steuerung aus einem try -Block (einschließlich seiner Handler) zu übertragen. Wenn dies geschieht, wird jede Variable, die im try -Block deklariert wurde, im Kontext zerstört, der ihre Deklaration direkt enthält:

try
{
    T1 t1;
    try
    {
        T2 t2;
        goto label; // zerstöre zuerst t2, dann t1
    }
    catch(...)
    {
        // wird ausgeführt, falls eine Exception beim Zerstören von t2 geworfen wird
    }
}
catch(...)
{
    // wird ausgeführt, falls eine Exception beim Zerstören von t1 geworfen wird
}
label: ;

Schlüsselwörter

try

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 98 C++98 eine switch Anweisung kann die Kontrolle
in die compound-statement eines try Blocks übertragen
verboten
CWG 1167 C++98 es war nicht spezifiziert, ob ein try Block einer Funktion
bei einem Destruktor Ausnahmen von Basis- oder Member-Destruktoren abfängt
solche Ausnahmen
werden abgefangen

Siehe auch