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

https://es.wikipedia.org/wiki/Manejo_de_excepciones

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 variable message "que es el mensaje de nuestra excepción" lo cual podemos hacer con cout o cerr
#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ón

El 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ón division


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!

You may also like...