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

Una excepción lanzada en un bloque try puede ser manejada por un controlador asociado.

Contenidos

Sintaxis

try instrucción-compuesta secuencia-manejadores (1)
try inicializador-constructor  (opcional) instrucción-compuesta secuencia-manejadores (2)
2) Un bloque try de función . compound-statement debe ser el componente de sentencia compuesta de un cuerpo de función.
compound-statement - una instrucción compuesta
handler-seq - una secuencia no vacía de manejadores
ctor-initializer - lista de inicialización de miembros (solo para constructores )

Bloque try ordinario

Un bloque try ordinario es una sentencia .

Si se lanza una excepción desde su compound-statement , la excepción será comparada con los handlers en su handler-seq :

void f()
{
    throw 1;     // NO manejado por el manejador de abajo
    try
    {
        throw 2; // manejado por el manejador asociado
    }
    catch (...)
    {
        // maneja la excepción 2
    }
    throw 3;     // NO manejado por el manejador de arriba
}

Bloque try de función

Un bloque de función try es un tipo especial de cuerpo de función .

Si se lanza una excepción desde su compound-statement o desde su ctor-initializer (si existe), la excepción será comparada con los handlers en su handler-seq :

int f(bool cond)
{
    if (cond)
        throw 1;
    return 0;
}
struct X
{
    int mem;
    X() try : mem(f(true)) {}
    catch (...)
    {
        // maneja la excepción 1
    }
    X(int) try
    {
        throw 2;
    }
    catch (...)
    {
        // maneja la excepción 2
    }
};

Las excepciones lanzadas en destructores de objetos con duración de almacenamiento estático o en constructores de objetos asociados con variables no de bloque con duración de almacenamiento estático no son capturadas por un bloque try de función en la main función .

Las excepciones lanzadas en destructores de objetos con duración de almacenamiento de hilo o en constructores de objetos asociados con variables no bloqueantes con duración de almacenamiento de hilo no son capturadas por un bloque try función en la función inicial del hilo.

(since C++11)

Salir del final de la sentencia-compuesta de un manejador de un bloque try de función es equivalente a salir del final de la sentencia - compuesta de ese bloque try de función, a menos que la función sea un constructor o destructor (ver más abajo).

Constructor y destructor try block

Para una clase C , si el cuerpo de la función de su definición de constructor o destructor es un bloque de función try , y se lanza una excepción durante la inicialización o destrucción, respectivamente, de los subobjetos de C , la excepción también será comparada con los manejadores en la secuencia-de-manejadores  del bloque de función try :

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 (...)
    {
        // maneja la excepción 1
    }
    ~Y() try {}
    catch (...)
    {
        // maneja la excepción 2
    }
};

Hacer referencia a cualquier miembro no estático o clase base de un objeto en el manejador para un bloque try de función de un constructor o destructor para ese objeto resulta en comportamiento indefinido.

Si una return sentencia aparece en un manejador del bloque try de función de un constructor, el programa está mal formado.

La excepción actualmente manejada es relanzada si el control alcanza el final de un manejador del bloque try de función de un constructor o destructor.

Flujo de control

La compound-statement de un bloque try es una declaración de flujo de control limitado :

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

Una sentencia de salto ( goto , break , return , continue ) puede utilizarse para transferir el control fuera de un bloque try (incluyendo sus manejadores). Cuando esto ocurre, cada variable declarada en el bloque try será destruida en el contexto que contiene directamente su declaración:

try
{
    T1 t1;
    try
    {
        T2 t2;
        goto label; // destruir primero t2, luego t1
    }
    catch(...)
    {
        // se ejecuta si se lanza una excepción al destruir t2
    }
}
catch(...)
{
    // se ejecuta si se lanza una excepción al destruir t1
}
label: ;

Palabras clave

try

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
CWG 98 C++98 una sentencia switch puede transferir control
hacia el compound-statement de un bloque try
prohibido
CWG 1167 C++98 no estaba especificado si un bloque try de función en un destructor
capturaría excepciones de un destructor de base o miembro
tales excepciones
son capturadas

Véase también