Cómo se evalúan los bloques catch (C++)
C++ permite iniciar excepciones de cualquier tipo, aunque en general se recomienda iniciar tipos derivados de std::exception. Una excepción de C++ se puede detectar mediante un controlador catch
que especifique el mismo tipo que la excepción, o mediante un controlador que pueda detectar cualquier tipo de excepción.
Si el tipo de excepción que se inicia es una clase, que también tiene una o varias clases base, se puede detectar mediante los controladores que aceptan las clases base del tipo de la excepción, así como referencias a las bases del tipo de la excepción. Observe que, cuando una referencia detecta una excepción, está enlazada al objeto de excepción real que se ha iniciado; si no, es una copia (igual que un argumento de una función).
Cuando se inicia una excepción, se puede detectar mediante los siguientes tipos de controladores catch
:
Un controlador que pueda aceptar cualquier tipo (mediante la sintaxis de puntos suspensivos).
Un controlador que acepte el mismo tipo que el objeto de excepción; dado que es una copia, se omiten los modificadores
const
yvolatile
.Un controlador que acepte una referencia al mismo tipo que el objeto de excepción.
Un controlador que acepte una referencia a una forma
const
ovolatile
del mismo tipo que el objeto de excepción.Un controlador que acepte una clase base del mismo tipo que el objeto de excepción; dado que es una copia, se omiten los modificadores
const
yvolatile
. El controladorcatch
para una clase base no debe preceder al controladorcatch
para la clase derivada.Un controlador que acepte una referencia a una clase base del mismo tipo que el objeto de excepción.
Un controlador que acepte una referencia a una forma
const
ovolatile
de una clase base del mismo tipo que el objeto de excepción.Un controlador que acepte un puntero al que pueda convertirse un objeto de puntero iniciado mediante las reglas de conversión de puntero estándar.
El orden en que los controladores catch
aparecen es importante, porque los controladores de un bloque try
determinado se examinan por orden de aparición. Por ejemplo, es un error colocar el controlador para una clase base antes del controlador para una clase derivada. Una vez encontrado un controlador catch
coincidente, no se examinan los controladores subsiguientes. Como resultado, un controlador catch
de puntos suspensivos debe ser el último controlador de su bloque try
. Por ejemplo:
// ...
try
{
// ...
}
catch( ... )
{
// Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
// Handle CExcptClass exception here.
}
En este ejemplo, el controlador catch
de puntos suspensivos es el único controlador que se examina.
Consulte también
Procedimientos recomendados de C++ moderno para las excepciones y el control de errores
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de