¿Qué es el manejo de excepciones en C ++?
El manejo de excepciones en C ++ le proporciona una forma de manejar circunstancias inesperadas como errores en tiempo de ejecución. Entonces, cuando ocurre una circunstancia inesperada, el control del programa se transfiere a funciones especiales conocidas como controladores.
Para detectar las excepciones, coloque alguna sección del código bajo inspección de excepciones. La sección de código se coloca dentro del bloque try-catch.
Si ocurre una situación excepcional dentro de esa sección de código, se lanzará una excepción. A continuación, el controlador de excepciones asumirá el control del programa.
En caso de que no ocurra ninguna circunstancia excepcional, el código se ejecutará normalmente. Los manipuladores serán ignorados.
En este tutorial de C ++, aprenderá:
- ¿Qué es el manejo de excepciones en C ++?
- ¿Por qué el manejo de excepciones?
- Palabras clave de manejo de excepciones
- Sintaxis:
- Excepciones estándar de C ++
- Excepciones definidas por el usuario
¿Por qué el manejo de excepciones?
Aquí está la razón para usar el manejo de excepciones en C ++:
- Separará su código de manejo de errores de su código normal. El código será más legible y más fácil de mantener.
- Las funciones pueden manejar las excepciones que elijan. Incluso si una función arroja muchas excepciones, solo manejará algunas. La persona que llama se encargará de las excepciones no detectadas.
Palabras clave de manejo de excepciones
El manejo de excepciones en C ++ gira en torno a estas tres palabras clave:
- throw : cuando un programa encuentra un problema, lanza una excepción. La palabra clave throw ayuda al programa a realizar el lanzamiento.
- catch : un programa utiliza un controlador de excepciones para detectar una excepción. Se agrega a la sección de un programa donde necesita manejar el problema. Se hace usando la palabra clave catch.
- try : el bloque try identifica el bloque de código para el que se activarán determinadas excepciones. Debería ir seguido de uno o más bloques de captura.
Suponga que un bloque de código generará una excepción. La excepción se detectará mediante un método que utilice palabras clave try and catch. El bloque try / catch debe rodear el código que puede generar una excepción. Dicho código se conoce como código protegido.
Sintaxis:
El try / catch toma esta sintaxis:
try {// the protected code} catch( Exception_Name exception1 ) {// catch block} catch( Exception_Name exception2 ) {// catch block} catch( Exception_Name exceptionN ) {// catch block}
- Aunque tenemos una declaración try, podemos tener muchas declaraciones catch.
- ExceptionName es el nombre de la excepción que se va a capturar.
- La excepción1, la excepción2 y la excepciónN son sus nombres definidos para hacer referencia a las excepciones.
Ejemplo 1:
#include#include using namespace std;int main() {vector vec;vec.push_back(0);vec.push_back(1);// access the third element, which doesn't existtry{vec.at(2);}catch (exception& ex){cout << "Exception occurred!" << endl;}return 0;}
Producción:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Incluya el archivo de encabezado de iostream en el programa para usar sus funciones.
- Incluya el archivo de encabezado vectorial en el programa para usar sus funciones.
- Incluya el espacio de nombres estándar en el programa en sus clases sin llamarlo.
- Llame a la función main (). La lógica del programa debe agregarse dentro de su cuerpo.
- Cree un vector llamado vec para almacenar datos enteros.
- Agregue el elemento 0 al vector llamado vec.
- Agregue el elemento 1 al vector llamado vec.
- Un comentario. Será omitido por el compilador de C ++.
- Utilice la instrucción try para detectar una excepción. El {marca el comienzo del cuerpo del bloque try / catch. El código agregado dentro del cuerpo se convertirá en el código protegido.
- Intente acceder al elemento almacenado en el índice 2 (tercer elemento) del vector llamado vec. Este elemento no existe.
- Fin del cuerpo del bloque try / catch.
- Atrapa la excepción. El mensaje de error devuelto se almacenará en la variable ex.
- Imprima algún mensaje en la consola si se detecta la excepción.
- Fin del cuerpo del bloque de captura.
- El programa debería devolver un valor tras una ejecución satisfactoria.
- Fin del cuerpo de la función main ().
Ejemplo 2:
#includeusing namespace std;double zeroDivision(int x, int y) {if (y == 0) {throw "Division by Zero!";}return (x / y);}int main() {int a = 11;int b = 0;double c = 0;try {c = zeroDivision(a, b);cout << c << endl;}catch (const char* message) {cerr << message << endl;}return 0;}
Producción:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Incluya el archivo de encabezado de iostream en el programa para usar sus funciones.
- Incluya el espacio de nombres estándar en el programa en sus clases sin llamarlo.
- Cree una función denominada zeroDivision que tome dos argumentos enteros, x e y. La función debería devolver un resultado doble.
- Utilice una instrucción if para comprobar si el valor del argumento de la variable y es 0. {marca el comienzo del cuerpo if.
- El mensaje que se devolverá / lanzará si y es 0.
- Fin del cuerpo de la sentencia if.
- La función zeroDivision debería devolver el valor de x / y.
- Fin del cuerpo de la función zeroDivision.
- Llame al método main (). El {marca el comienzo de este método.
- Declare una variable entera y asígnele el valor 11.
- Declare una variable entera by asignándole el valor 0.
- Declare una variable doble cy asignándole el valor 0.
- Utilice la instrucción try para detectar una excepción. El {marca el comienzo del cuerpo del bloque try / catch. El código agregado dentro del cuerpo se convertirá en el código protegido.
- Llame a la función zeroDivision y pase a los argumentos ayb, es decir, 11 y 0. El resultado de esta operación se almacenará en la variable c.
- Imprime el valor de la variable c en la consola.
- Fin del cuerpo del bloque try / catch.
- Atrapa la excepción. El mensaje de error devuelto se almacenará en el mensaje de variable.
- Imprima el mensaje de error devuelto en la consola.
- Fin del cuerpo del bloque de captura.
- El programa debería devolver un valor tras una ejecución satisfactoria.
- Fin del cuerpo de la función main ().
Excepciones estándar de C ++
C ++ viene con una lista de excepciones estándar definidas en la clase
Excepción | Descripción |
std :: excepción | Esta es una excepción y la clase principal de todas las excepciones estándar de C ++. |
std :: bad_alloc | Esta excepción es lanzada por una nueva palabra clave. |
std :: bad_cast | Esta es una excepción lanzada por dynamic_cast. |
std :: bad_exception | Un dispositivo útil para manejar excepciones inesperadas en programas C ++. |
std :: bad_typeid | Una excepción lanzada por typeid. |
std :: error_lógica | Esta excepción es teóricamente detectable mediante la lectura de código. |
std :: domain_error | Esta es una excepción lanzada después de usar un dominio matemáticamente inválido. |
std :: invalid_argument | Se lanzó una excepción por usar argumentos no válidos. |
std :: length_error | Una excepción lanzada después de crear un std :: string grande. |
std :: out_of_range | Lanzado por el método. |
std :: runtime_error | Esta es una excepción que no se puede detectar leyendo el código. |
std :: overflow_error | Esta excepción se lanza después de la ocurrencia de un desbordamiento matemático. |
std :: range_error | Esta excepción se produce cuando intenta almacenar un valor fuera de rango. |
std :: underflow_error | Una excepción lanzada después de la ocurrencia de un desbordamiento matemático. |
Excepciones definidas por el usuario
La clase std :: exception de C ++ nos permite definir objetos que se pueden lanzar como excepciones. Esta clase se ha definido en el encabezado
Esta función devuelve una secuencia de caracteres terminada en nulo de tipo char *. Podemos sobrescribirlo en clases derivadas para tener una descripción de excepción.
Ejemplo:
#include#include using namespace std;class newException : public exception{virtual const char* what() const throw(){return "newException occurred";}} newex;int main() {try {throw newex;}catch (exception& ex) {cout << ex.what() << '\n';}return 0;}
Producción:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Incluya el archivo de encabezado de iostream en nuestro programa. Usaremos sus funciones sin obtener errores.
- Incluya el archivo de encabezado de excepción en nuestro programa. Usaremos sus funciones así sin errores.
- Incluya el espacio de nombres std en nuestro programa para usar sus clases sin llamarlo.
- Cree una nueva clase llamada newException. Esta clase hereda la clase de excepción de C ++.
- El comienzo del cuerpo de la clase.
- Sobrescriba la función de miembro virtual what () definido en el archivo de encabezado de excepción. Luego describiremos nuestra propia excepción, la nueva excepción.
- Inicie la definición de la nueva excepción.
- El mensaje que se devolverá si se detecta la nueva excepción.
- Fin de la definición de la nueva excepción.
- Fin del cuerpo de la clase newException. Newex es el nombre que se utilizará para detectar nuestra nueva excepción, después de lo cual se llamará a newException.
- Llame a la función main (). La lógica del programa debe agregarse dentro de su cuerpo. El {marca el comienzo de su cuerpo.
- Use una declaración try para marcar el código dentro del cual necesitamos marcar la excepción. El {marca el comienzo del cuerpo del bloque try / catch. El código rodeado por esto quedará protegido.
- Lanza la excepción newex si se detecta.
- Fin del cuerpo de prueba.
- Utilice la declaración de captura para detectar la excepción. El mensaje de error de excepción se almacenará en la variable ex.
- Imprima el mensaje de error de excepción en la consola.
- Fin del cuerpo de la declaración de captura.
- El programa debería devolver un valor si se ejecuta correctamente.
- Fin del cuerpo de la función main ().
Resumen:
- Con el manejo de excepciones en C ++, puede manejar errores en tiempo de ejecución.
- Los errores de tiempo de ejecución son los errores que ocurren durante la ejecución del programa.
- El manejo de excepciones lo ayuda a manejar cualquier circunstancia inesperada en su programa.
- Cuando ocurre una circunstancia inesperada, el control del programa se transfiere a los controladores.
- Para detectar una excepción, coloque una sección de código debajo del bloque try-catch.
- La palabra clave throw ayuda al programa a lanzar excepciones, lo que ayuda al programa a manejar el problema.
- La palabra clave try ayuda a identificar el bloque de código para el que se activarán determinadas excepciones.
- Podemos sobrescribir la función what () del archivo de encabezado de excepción para definir nuestras excepciones.