Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

Manejo de excepciones en C++: Guía práctica con try, catch, throw

¿Qué es el manejo de excepciones en C++?

El manejo de excepciones permite a los programas C++ recuperarse elegantemente de errores inesperados en tiempo de ejecución. Cuando ocurre un error, el control salta a un manejador especial que decide cómo responder.

Al encerrar código potencialmente problemático dentro de un bloque try y seguirlo con una o más cláusulas catch, brinda al programa una ruta clara para gestionar condiciones excepcionales.

Si no se lanza ninguna excepción, el bloque try se ejecuta normalmente y los manejadores se omiten.

En este tutorial aprenderá:

¿Por qué manejo de excepciones?

El manejo de excepciones ofrece varios beneficios tangibles:

Palabras clave del manejo de excepciones

Tres palabras clave forman la columna vertebral del manejo de excepciones en C++:

El código dentro del bloque try se llama código protegido; si lanza, se ejecuta el bloque catch correspondiente.

Sintaxis

 try {
    // código protegido
} catch (NombreExcepción excepción1) {
    // manejar excepción1
} catch (NombreExcepción excepción2) {
    // manejar excepción2
} // ... más bloques catch 

Ejemplo 1: Acceso a elemento de vector fuera de rango

#include<iostream>
#include<vector>
using namespace std;
int main() {
    vector<int> vec;
    vec.push_back(0);
    vec.push_back(1);
    try {
        vec.at(2); // fuera de rango
    } catch (exception& ex) {
        cout << "¡Ocurrió una excepción!" << endl;
    }
    return 0;
} 

Salida:

Manejo de excepciones en C++: Guía práctica con try, catch, throw

Captura del código:

Manejo de excepciones en C++: Guía práctica con try, catch, throw

Desglose del código:

  1. Incluya iostream y vector para E/S y contenedores.
  2. Use el espacio de nombres std para evitar nombres completamente calificados.
  3. Instancie un vector<int> y pueblelo.
  4. Intente acceder a un elemento fuera de los límites dentro de un bloque try.
  5. Capture la excepción estándar std::exception y muestre un mensaje.
  6. Retorne desde main.

Ejemplo 2: Manejo de división por cero

#include <iostream>
using namespace std;
double divisionCero(int x, int y) {
    if (y == 0) {
        throw "¡División por cero!";
    }
    return static_cast(x) / y;
}
int main() {
    int a = 11;
    int b = 0;
    double c = 0;
    try {
        c = divisionCero(a, b);
        cout << c << endl;
    } catch (const char* mensaje) {
        cerr << mensaje << endl;
    }
    return 0;
} 

Salida:

Manejo de excepciones en C++: Guía práctica con try, catch, throw

Captura del código:

Manejo de excepciones en C++: Guía práctica con try, catch, throw

Desglose del código:

  1. Defina divisionCero que lanza una cadena C cuando se divide por cero.
  2. Llame a la función dentro de un bloque try e imprima el resultado.
  3. Capture la excepción de cadena y muestre un mensaje de error.

Excepciones estándar de C++

Manejo de excepciones en C++: Guía práctica con try, catch, throw

La Biblioteca Estándar declara una rica jerarquía de excepciones en <exception>. A continuación, las más usadas:

ExcepciónDescripción
std::exceptionClase base para todas las excepciones estándar.
std::bad_allocLanzada por new en fallo de asignación.
std::bad_castLanzada por dynamic_cast cuando un cast falla.
std::bad_exceptionUsada para señalar una excepción inesperada.
std::bad_typeidLanzada por typeid en glvalue de tipo polimórfico nulo.
std::logic_errorErrores detectables por el programador.
std::domain_errorDominio inválido para función matemática.
std::invalid_argumentFunción recibió argumento inválido.
std::length_errorIntento de crear cadena demasiado grande.
std::out_of_rangeLanzada por vector::at cuando índice fuera de límites.
std::runtime_errorErrores en tiempo de ejecución no capturados por otras categorías.
std::overflow_errorDesbordamiento matemático ocurrido.
std::range_errorValor fuera de rango para la operación.
std::underflow_errorSubdesbordamiento matemático ocurrido.

Excepciones definidas por el usuario

La clase base std::exception puede extenderse para crear tipos de error específicos del dominio. Sobrescribir what() proporciona un mensaje descriptivo.

Ejemplo: Excepción personalizada

#include <iostream>
#include <exception>
using namespace std;
class NuevaExcepcion : public exception {
public:
    const char* what() const noexcept override {
        return "Ocurrió nuevaExcepcion";
    }
} newex;
int main() {
    try {
        throw newex;
    } catch (exception& ex) {
        cout << ex.what() << '\n';
    }
    return 0;
} 

Salida:

Manejo de excepciones en C++: Guía práctica con try, catch, throw

Captura del código:

Manejo de excepciones en C++: Guía práctica con try, catch, throw

Desglose del código:

  1. Derive NuevaExcepcion de std::exception y sobrescriba what().
  2. Instancie un objeto newex para lanzar.
  3. Lance newex dentro de un bloque try.
  4. Capture por referencia a std::exception e imprima el mensaje vía what().

Conclusiones

Lenguaje C

  1. Comentarios en C++: Mejores Prácticas para Código Legible y Mantenible
  2. Operadores en C++ explicados: Tipos, ejemplos y programas de muestra
  3. Dominando switch-case en C++: Sintaxis, uso y ejemplos prácticos
  4. Asignación dinámica de arrays en C++: Guía práctica con ejemplos de código
  5. Structs en C++ explicados con un ejemplo práctico
  6. Dominar std::list en C++: Sintaxis, Funciones y Ejemplos Prácticos
  7. Struct vs Class en C++: Diferencias Clave, Sintaxis y Mejores Casos de Uso
  8. Los 15 Mejores IDEs para C++ en Windows, macOS y Linux – Opciones Gratuitas y de Pago (2021)
  9. Dominando el Manejo de Excepciones en Python: try, except, else y finally Explicados
  10. Dominando el manejo de excepciones en Java: Try, Catch, Finally, Throw y Throws explicados
  11. Dominando el manejo de excepciones en Java: Try, Catch, Finally y Recursos