Biblioteca de manejo de excepciones de C++ <stdexcept>
<stdexcept>Es un archivo de cabecera de la biblioteca estándar de C++ que define un conjunto de clases de excepción estándar para manejar errores en tiempo de ejecución del programa.
Las excepciones son errores que ocurren durante la ejecución del programa; pueden capturarse y manejarse para evitar la terminación anormal del programa.<stdexcept>El archivo de cabecera define un conjunto destd::exceptionclases de excepción derivadas, que proporcionan una forma estándar de reportar y manejar errores.
Sintaxis
Para usar<stdexcept>las clases de excepción en él, primero necesitas incluir este archivo de cabecera:
#include <stdexcept>
Luego, puedes usar estas clases de excepción para lanzar y capturar excepciones. Por ejemplo:
throw std::runtime_error("An error occurred");
Clases de excepción
<stdexcept>El archivo de cabecera define las siguientes clases de excepción:
std::exception: la clase base de todas las clases de excepción estándar.std::bad_exception: se lanza cuando ocurre un error durante el manejo de excepciones.std::bad_alloc: se lanza cuando falla la asignación de memoria.std::bad_cast: se lanza cuando falla la conversión de tipos.std::bad_typeid: cuandotypeidla operación falla, se lanza.std::logic_error: se lanza cuando ocurre un error lógico, por ejemplo, un parámetro de entrada no válido.std::domain_error: se lanza cuando el argumento de una llamada a función no está dentro del rango válido.std::invalid_argument: se lanza cuando el argumento de una llamada a función no es válido.std::length_error: se lanza cuando una operación de contenedor falla debido a una limitación de longitud.std::out_of_range: se lanza cuando se accede a un índice no válido de un contenedor.std::overflow_error: se lanza cuando una operación aritmética produce desbordamiento.std::range_error: se lanza cuando el valor de retorno de una función no está dentro del rango esperado.std::underflow_error: se lanza cuando una operación aritmética produce subdesbordamiento.
Ejemplo
A continuación se muestra un ejemplo que utiliza<stdexcept>un ejemplo simple que demuestra cómo lanzar y capturar excepciones:
Ejemplo
#include <stdexcept>
void riskyFunction(int x) {
if (x < 0) {
throw std::invalid_argument("Negative value not allowed");
}
std::cout << "Processing " << x << std::endl;
}
int main() {
try {
riskyFunction(-1);
} catch (const std::invalid_argument& e) {
std::cerr << "Caught an exception: " << e.what() << std::endl;
}
return 0;
}
Salida:
Caught an exception: Negative value not allowed
En este ejemplo,riskyFunctionla función comprueba si el parámetro pasado es negativo; si lo es, lanza unastd::invalid_argumentexcepción. Enmainla función, usamostry-catchun bloque para capturar y manejar esta excepción.
Clases de excepción estándar
std::exception
std::exception es la clase base de todas las clases de excepción estándar. Proporciona una función virtual what() que devuelve una cadena que describe la excepción.
Ejemplo
#include <exception>
int main() {
try {
throw std::exception();
} catch (const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
}
return 0;
}
std::logic_error
std::logic_error deriva de std::exception y representa errores lógicos del programa. Es una clase base abstracta que normalmente es concretada por clases derivadas.
Ejemplo
#include <stdexcept>
int main() {
try {
throw std::logic_error("Logic error occurred");
} catch (const std::logic_error& e) {
std::cout << "Caught logic error: " << e.what() << std::endl;
}
return 0;
}
std::invalid_argument
std::invalid_argument deriva de std::logic_error y representa que se ha pasado un argumento no válido.
Ejemplo
#include <stdexcept>
int main() {
try {
throw std::invalid_argument("Invalid argument provided");
} catch (const std::invalid_argument& e) {
std::cout << "Caught invalid argument: " << e.what() << std::endl;
}
return 0;
}
std::domain_error
std::domain_error deriva de std::logic_error y representa que el argumento está fuera del dominio válido.
Ejemplo
#include <stdexcept>
int main() {
try {
throw std::domain_error("Domain error occurred");
} catch (const std::domain_error& e) {
std::cout << "Caught domain error: " << e.what() << std::endl;
}
return 0;
}
std::length_error
std::length_error deriva de std::logic_error y representa un error de longitud, como exceder el límite máximo de longitud en operaciones de contenedor.
Ejemplo
#include <stdexcept>
int main() {
try {
throw std::length_error("Length error occurred");
} catch (const std::length_error& e) {
std::cout << "Caught length error: " << e.what() << std::endl;
}
return 0;
}
std::out_of_range
std::out_of_range deriva de std::logic_error y representa un acceso fuera del rango válido.
Ejemplo
#include <stdexcept>
int main() {
try {
throw std::out_of_range("Out of range error occurred");
} catch (const std::out_of_range& e) {
std::cout << "Caught out of range error: " << e.what() << std::endl;
}
return 0;
}
std::runtime_error
std::runtime_error deriva de std::exception y representa errores en tiempo de ejecución del programa. Es una clase base abstracta que normalmente es concretada por clases derivadas.
Ejemplo
#include <stdexcept>
int main() {
try {
throw std::runtime_error("Runtime error occurred");
} catch (const std::runtime_error& e) {
std::cout << "Caught runtime error: " << e.what() << std::endl;
}
return 0;
}
std::range_error
std::range_error deriva de std::runtime_error y representa que el resultado de un cálculo está fuera del rango representable.
Ejemplo
#include <stdexcept>
int main() {
try {
throw std::range_error("Range error occurred");
} catch (const std::range_error& e) {
std::cout << "Caught range error: " << e.what() << std::endl;
}
return 0;
}
std::overflow_error
std::overflow_error deriva de std::runtime_error y representa un error de desbordamiento aritmético.
Ejemplo
#include <stdexcept>
int main() {
try {
throw std::overflow_error("Overflow error occurred");
} catch (const std::overflow_error& e) {
std::cout << "Caught overflow error: " << e.what() << std::endl;
}
return 0;
}
std::underflow_error
std::underflow_error deriva de std::runtime_error y representa un error de subdesbordamiento aritmético.
Ejemplo
#include <stdexcept>
int main() {
try {
throw std::underflow_error("Underflow error occurred");
} catch (const std::underflow_error& e) {
std::cout << "Caught underflow error: " << e.what() << std::endl;
}
return 0;
}
Usar clases de excepción personalizadas
Además de las clases de excepción estándar, también podemos definir nuestras propias clases de excepción, heredando de las clases de excepción estándar.
Ejemplo
#include <stdexcept>
class MyException : public std::runtime_error {
public:
MyException(const std::string& message) : std::runtime_error(message) {}
};
int main() {
try {
throw MyException("My custom exception occurred");
} catch (const MyException& e) {
std::cout << "Caught custom exception: " << e.what() << std::endl;
}
return 0;
}
<stdexcept>es un componente importante de la biblioteca estándar de C++. Proporciona un conjunto de clases de excepción estándar que hacen que el manejo de errores sea más consistente y predecible. Al usar estas clases de excepción, puedes escribir código más robusto y fácil de mantener. Para los principiantes, comprender los conceptos básicos de las excepciones y cómo usar<stdexcept>las clases de excepción en él es muy importante.