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:
- 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() .
- 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() .
- 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.