Personalización del comportamiento de terminación para una excepción no detectada en C++

Cada vez que surge una excepción en C++, se maneja según el comportamiento definido mediante el bloque try-catch. Sin embargo, a menudo se da el caso de que se lanza una excepción pero no se detecta porque el subsistema de manejo de excepciones no puede encontrar un bloque catch coincidente para esa excepción en particular. En ese caso, se lleva a cabo el siguiente conjunto de acciones:

  1. El subsistema de manejo de excepciones llama a la función: inesperado() . Esta función, proporcionada por la biblioteca C++ predeterminada, define el comportamiento cuando surge una excepción no detectada. Por defecto, las llamadas inesperadas terminan() .
  2. La función de finalización define las acciones que se realizarán durante la finalización del proceso. Esto, por defecto, llama a abort() .
  3. El proceso es abortado.

Terminar() e inesperado() simplemente llaman a otras funciones para manejar un error. Como se explicó anteriormente, las llamadas de finalización abort() y las llamadas inesperadas() terminan(). Por lo tanto, ambas funciones detienen la ejecución del programa cuando ocurre un error de manejo de excepciones. Sin embargo, puede cambiar la forma en que ocurre la terminación.

Para cambiar el controlador de terminación, la función utilizada es set_terminate(terminate_handler newhandler), que se define en el encabezado <exception> .

El siguiente programa demuestra cómo configurar un controlador de terminación personalizado:

// CPP program to set a new termination handler
// for uncaught exceptions.
#include <exception>
#include <iostream>
using namespace std;
  
// definition of custom termination function
void myhandler()
{
    cout << "Inside new terminate handler\n";
    abort();
}
  
int main()
{
    // set new terminate handler
    set_terminate(myhandler); 
    try {
        cout << "Inside try block\n";
        throw 100;
    }
    catch (char a) // won't catch an int exception
    {
        cout << "Inside catch block\n";
    }
    return 0;
}

Producción:

Inside try block
Inside new terminate handler


Error de tiempo de ejecución:

Abort signal from abort(3) (SIGABRT)

Debe tenerse debidamente en cuenta que lo único que debe hacer su controlador de finalización personalizado es detener la ejecución del programa. No debe volver al programa ni reanudarlo de ninguna manera.

Publicación traducida automáticamente

Artículo escrito por ParthDutt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *