Excepciones en C++
Saludos, hoy vamos hablar un poco sobre el manejo de excepciones en C++. Imagino que las personas que leen este blog tendrán conocimiento de lo que es una excepción y como se manejan, para los que no o los que desean recordar un poco los conceptos les dejo este enlace de la wikipedia
Para el día de hoy vamos a ver tres ejemplos sobre el manejo de excepciones, los cuales explicaré con unos ejemplos sencillos.
Vamos a descomponer nuestro primer ejemplo para explicarlo y luego veremos el código
- Tenemos una función que divide dos enteros y retorna un entero
- Como no se puede hacer división para 0 ponemos una condición y si cumple lanzamos una excepción usando
throw
- En nuestro
main
llamamos a la función de división dentro de un bloque try-catch - El bloque try-catch hace lo siquiente:
try
intenta ejecutar el código- Si la ejecución falla o lanza una excepción la misma será capturada por la sección
catch
catch
tiene entre paréntesis el tipo de excepción capturada- Es este caso específico lanzamos un mensaje que podemos capturar como
const char *message
- Dentro de la sección
catch
imprimimos nuestra variablemessage
"que es el mensaje de nuestra excepción" lo cual podemos hacer concout
ocerr
#include <iostream>
using namespace std;
int division(int a, int b) {
if(b == 0) {
throw "Division by zero not allowed";
}
return a/b;
}
int main(int argc, char *argv[]) {
try {
cout << "Division result is: " << division(9,3) << endl;
cout << "Division result is: " << division(5,0) << endl;
} catch(const char *message) {
cerr << message << endl;
}
return 0;
}
El resultado de este código es:
Division result is: 3
Division result is: Division by zero not allowed
Ejecuta el primero de manera correcta
Intenta imprimir el segundo, pero después del mensaje "Divisrion result is: ", lanza el mensaje de la excepciónEl tipo de excepción lanzada puede ser un entero, double, etc y eso hará que nuestra captura también cambie
Muy bien, ahora ¿qué pasa si por alguna razón no conocemos la excepción que va a ser lanzada?
¿Cómo capturamos esta desconocida excepción?
- Usando el mismo ejercicio, vamos a creer que la excepción lanzada es de tipo
int
- Como vimos con anterioridad es un mensaje de texto
- Por lo tanto esa excepción no va a ser capturada
- Agregamos una nueva sección de
catch
, pero en vez de decirle el tipo de excepción, dentro de los paréntesis escribimos...
esto significa que es la excepción por defecto
#include <iostream>
using namespace std;
int division(int a, int b) {
if(b == 0) {
throw "Division by zero not allowed";
}
return a/b;
}
int main(int argc, char *argv[]) {
try {
cout << "Division result is: " << division(7,0) << endl;
} catch(int e) {
cerr << "Int exception caught with message: " << e << endl;
} catch(...) {
cerr << "Default exception caught" << endl;
}
return 0;
}
El resultado de este código es:
Division result is: Default exception caught
Podemos ver que se imprime el mensaje especificado en la sección
catch
por defecto y no el mensaje de la funcióndivision
Dejamos al final lo mas interesante, ¿Que pasa si quiero crear una excepción personalizada?
En C++ podemos hacer nuestras propias excepciones, lo haremos de la siguiente manera:
- Incluímos
exception
en nuestro archivo - Creamos una clase que herede de exception
- Creamos el mensage de la excepción en una función
- Lo lanzamos dentro de un bloque
try-catch
- En la sección
catch
capturamos como tipo el nombre de nuestra clase de excepción - Dentro de la sección
catch
llamamos a la función que contiene el mensaje
#include <iostream>
#include <exception>
#include <string>
using namespace std;
class MyCustomException: public exception {
public:
string message() {
return "Custom exception...";
}
};
int main(int argc, char *argv[]) {
try {
throw MyCustomException();
} catch(MyCustomException e) {
cerr << "Custom exception thrown with message: " << e.message() << endl;
}
return 0;
}
El resultado de este código es:
Custom exception thrown with message: Custom exception...
Cómo se puede observar el resultado es el mensaje escrito en la sección
catch
junto al mensaje de la excepción personalizada
El código de estos ejemplos lo pueden encontrar en: https://github.com/nano-bytes/cpp-compilation
Eso es todo por hoy, espero que lo hayan disfrutado
Happy Hacking!
Hasta otra!