C++ Manejo de excepciones: ejemplo de prueba, captura y lanzamiento

โšก Resumen inteligente

Manejo de excepciones en C++ Permite que un programa detecte y responda a errores en tiempo de ejecuciรณn mediante try, catch y throw, evitando asรญ que se bloquee. Aquรญ aprenderรกs las palabras clave, la sintaxis, las excepciones estรกndar y las excepciones definidas por el usuario, con ejemplos.

  • โš ๏ธ Quรฉ es: El manejo de excepciones detecta los errores en tiempo de ejecuciรณn para que un programa pueda recuperarse.
  • ๐Ÿ”‘ Keywords: Utiliza try para probar el cรณdigo, throw para generar errores y catch para manejarlos.
  • ๐Ÿงพ Sintaxis: Coloca el cรณdigo arriesgado en un bloque try y gestiona los errores en bloques catch.
  • ๐Ÿ“š Excepciones estรกndar: C++ Proporciona excepciones integradas en el encabezado de excepciones.
  • ๐Ÿค– Ayuda de IA: Las herramientas de IA como GitHub Copilot aรฑaden bloques try-catch y manejo de errores.

C++ Manejo de excepciones

ยฟQuรฉ es el manejo de excepciones? C++?

Manejo de excepciones en C++ le proporciona una forma de manejar circunstancias inesperadas, como errores de tiempo de ejecuciรณn. Entonces, cada vez que ocurre una circunstancia inesperada, el control del programa se transfiere a funciones especiales conocidas como controladores.

Para detectar las excepciones, coloque alguna secciรณn de 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 generarรก una excepciรณn. A continuaciรณn, el controlador de excepciones tomarรก el control del programa.

En caso de que no ocurra ninguna circunstancia excepcional, el cรณdigo se ejecutarรก normalmente. Los controladores serรกn ignorados.

En esta C++ tutorial, aprenderรกs:

ยฟPor quรฉ el manejo de excepciones?

A continuaciรณn se detallan los motivos para utilizar el manejo de excepciones en C++:

  • Separarรกs el cรณdigo de gestiรณn de errores del 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 genera muchas excepciones, solo manejarรก algunas. La persona que llama manejarรก las excepciones no detectadas.

Palabras clave de manejo de excepciones

Manejo de excepciones en C++ gira en torno a estas tres palabras clave:

  • lanzarโ€“ 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 cual se activarรกn ciertas excepciones. Debe ir seguido de uno o mรกs bloques de captura.

Supongamos que un bloque de cรณdigo generarรก una excepciรณn. La excepciรณn serรก detectada mediante un mรฉtodo que utiliza palabras clave try y catch. El bloque try/catch debe rodear el cรณdigo que pueda generar una excepciรณn. Este 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 de prueba, podemos tener muchas declaraciones de captura.
  • ExceptionName es el nombre de la excepciรณn que se va a detectar.
  • La excepciรณn1, la excepciรณn2 y la excepciรณnN son sus nombres definidos para referirse a las excepciones.

Ejemplo 1:

#include<iostream>
#include<vector>
using namespace std;

int main() {
	vector<int> vec;
	vec.push_back(0);	
	vec.push_back(1);	
	// access the third element, which doesn't exist
	try
	{
		vec.at(2);		
	}
	catch (exception& ex)
	{
		cout << "Exception occurred!" << endl;
	}
	return 0;
}

Salida:

Palabras clave de manejo de excepciones

Aquรญ hay una captura de pantalla del cรณdigo:

Palabras clave de manejo de excepciones

Code Explicaciรณn:

  1. Incluya el archivo de encabezado iostream en el programa para usar su funciones.
  2. Incluya el archivo de encabezado vectorial en el programa para utilizar sus funciones.
  3. Incluya el espacio de nombres estรกndar en el programa para sus clases sin llamarlo.
  4. Llame a la funciรณn principal(). La lรณgica del programa debe agregarse dentro de su cuerpo.
  5. Cree un vector llamado vec para almacenar datos enteros.
  6. Agrega el elemento 0 al vector llamado vec.
  7. Agrega el elemento 1 al vector llamado vec.
  8. Un comentario. Serรก omitido por el C++ compilador.
  9. Utilice la declaraciรณ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.
  10. Intente acceder al elemento almacenado en el รญndice 2 (tercer elemento) del vector denominado vec. Este elemento no existe.
  11. Fin del cuerpo del bloque try/catch.
  12. Capte la excepciรณn. El mensaje de error devuelto se almacenarรก en la variable ex.
  13. Imprima algรบn mensaje en la consola si se detecta la excepciรณn.
  14. Fin del cuerpo del bloque de captura.
  15. El programa deberรญa devolver un valor tras una ejecuciรณn exitosa.
  16. Fin del cuerpo de la funciรณn main().

Ejemplo 2:

#include <iostream>
using 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;
}

Salida:

Palabras clave de manejo de excepciones

Aquรญ hay una captura de pantalla del cรณdigo:

Palabras clave de manejo de excepciones

Code Explicaciรณn:

  1. Incluya el archivo de encabezado iostream en el programa para utilizar sus funciones.
  2. Incluya el espacio de nombres estรกndar en el programa para sus clases sin llamarlo.
  3. Cree una funciรณn denominada zeroDivision que acepte dos argumentos enteros, x e y. La funciรณn debe devolver un resultado doble.
  4. Utilice una declaraciรณn if para verificar si el valor del argumento variable y es 0. { marca el comienzo del cuerpo if.
  5. El mensaje que se devolverรก/arrojarรก si y es 0.
  6. Fin del cuerpo de la declaraciรณn if.
  7. La funciรณn zeroDivision deberรญa devolver el valor de x/y.
  8. Fin del cuerpo de la funciรณn zeroDivision.
  9. Llame al mรฉtodo principal(). El { marca el comienzo de este mรฉtodo.
  10. Declarar una variable entera y asignarle el valor 11.
  11. Declara una variable entera b y le asigna el valor 0.
  12. Declarar una variable doble c y asignarle el valor 0.
  13. Utilice la declaraciรณ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.
  14. Llamar a la funciรณn zeroDivision y pasar como argumentos a y b, es decir, 11 y 0. El resultado de esta operaciรณn se almacenarรก en la variable c.
  15. Imprima el valor de la variable c en la consola.
  16. Fin del cuerpo del bloque try/catch.
  17. Capte la excepciรณn. El mensaje de error devuelto se almacenarรก en la variable mensaje.
  18. Imprima el mensaje de error devuelto en la consola.
  19. Fin del cuerpo del bloque de captura.
  20. El programa deberรญa devolver un valor tras una ejecuciรณn exitosa.
  21. Fin del cuerpo de la funciรณn main().

C++ Excepciones estรกndar

C++ Excepciones estรกndar

C++ viene con una lista de excepciones estรกndar definidas en clase. Estos se describen a continuaciรณn:

Excepciรณn Mareas Ideales para Lecciones
std :: excepciรณn Esta es una excepciรณn y la clase principal de todos los estรกndares. C++ excepciones
std :: bad_alloc Esta excepciรณn la genera 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 C++
std::bad_typeid Una excepciรณn lanzada por typeid.
std::error_lรณgico Esta excepciรณn es teรณricamente detectable leyendo el cรณdigo.
std::dominio_error Esta es una excepciรณn lanzada despuรฉs de usar un dominio matemรกticamente no vรกlido.
std::argumento_invรกlido Se produce una excepciรณn por utilizar argumentos no vรกlidos.
std::longitud_error Se produce una excepciรณn despuรฉs de crear un std::string grande.
estรกndar::fuera_de_rango 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 produce despuรฉs de que se produce un desbordamiento matemรกtico.
std::rango_error Esta excepciรณn se produce cuando intenta almacenar un valor fuera de rango.
std::underflow_error Una excepciรณn lanzada despuรฉs de que se produjera un desbordamiento matemรกtico.

Excepciones definidas por el usuario

El C++ La clase std::exception nos permite definir objetos que pueden lanzarse como excepciones. Esta clase ha sido definida en el encabezamiento. La clase nos proporciona una funciรณn miembro virtual llamada what.

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 <iostream>
#include <exception>
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;	
}

Salida:

Excepciones definidas por el usuario

Aquรญ hay una captura de pantalla del cรณdigo:

Excepciones definidas por el usuario

Code Explicaciรณn:

  1. Incluya el archivo de encabezado iostream en nuestro programa. Usaremos sus funciones sin obtener errores.
  2. Incluya el archivo de encabezado de excepciรณn en nuestro programa. Usaremos sus funciones como quรฉ sin errores.
  3. Incluya el espacio de nombres estรกndar en nuestro programa para usar sus clases sin llamarlo.
  4. Cree una nueva clase llamada newException. Esta clase hereda la clase de excepciรณn de C++.
  5. El comienzo del cuerpo de clase.
  6. Sobrescriba la funciรณn miembro virtual what() definida en el archivo de encabezado de excepciรณn. Luego describiremos nuestra propia excepciรณn, la nueva excepciรณn.
  7. Inicie la definiciรณn de la nueva excepciรณn.
  8. El mensaje que se devolverรก si se detecta la nueva excepciรณn.
  9. Fin de la definiciรณn de la nueva excepciรณn.
  10. 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.
  11. Llame a la funciรณn principal(). La lรณgica del programa debe agregarse dentro de su cuerpo. El { marca el comienzo de su cuerpo.
  12. Utilice 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.
  13. Lanza la excepciรณn newex si se detecta.
  14. Fin del cuerpo del intento.
  15. Utilice la declaraciรณn catch para detectar la excepciรณn. El mensaje de error de excepciรณn se almacenarรก en la variable ex.
  16. Imprima el mensaje de error de excepciรณn en la consola.
  17. Fin del cuerpo de la declaraciรณn catch.
  18. El programa deberรญa devolver un valor si se ejecuta correctamente.
  19. Fin del cuerpo de la funciรณn main().

Preguntas Frecuentes

El manejo de excepciones es una forma de detectar y responder a errores de tiempo de ejecuciรณn en C++ Utilizando las palabras clave try, throw y catch, el programa puede recuperarse en lugar de bloquearse.

C++ Utiliza tres palabras clave: try encapsula el cรณdigo que podrรญa fallar, throw genera una excepciรณn cuando ocurre un error y catch maneja la excepciรณn generada.

Coloca el cรณdigo arriesgado en un bloque try, seguido de uno o mรกs bloques catch que manejen cada uno un tipo especรญfico de excepciรณn lanzada desde el bloque try.

Las excepciones estรกndar son clases de excepciรณn integradas en el encabezado de excepciones, como std::bad_alloc y std::out_of_range, que informan sobre errores comunes en tiempo de ejecuciรณn.

Una excepciรณn definida por el usuario es una clase personalizada, a menudo derivada de std::exception, que sobrescribe la funciรณn what() para describir su propia condiciรณn de error especรญfica.

Los asistentes de IA como GitHub Copilot envuelven el cรณdigo arriesgado en bloques try-catch, generan clases de excepciones personalizadas y sugieren quรฉ excepciones capturar mientras escribes.

Sรญ. Las herramientas impulsadas por IA detectan excepciones no controladas, sugieren bloques catch especรญficos en lugar de los genรฉricos y agregan mensajes de error significativos, lo que hace que su C++ cรณdigo mรกs robusto.

throw genera una excepciรณn cuando se detecta un error, mientras que catch recibe esa excepciรณn y ejecuta el cรณdigo que maneja o informa del error.

Resumir este post con: