Bibliothèque standard C++<exception>
En programmation C++, la gestion des exceptions est un important mécanisme de gestion des erreurs qui permet à un programme de gérer les erreurs élégamment au lieu de planter.
En C++, la gestion des exceptions est généralement implémentée à l'aide des mots-clés try, catch et throw. La bibliothèque standard fournit la classe std::exception et ses classes dérivées pour gérer les exceptions.
Dans la bibliothèque standard C++,<exception>Le fichier d'en-tête fournit un ensemble d'infrastructures de gestion des exceptions, notamment des classes d'exception, des mécanismes de gestion des exceptions, etc.
Une exception est un événement qui se produit pendant l'exécution d'un programme, qui interrompt le flux normal des instructions. En C++, une exception peut être un objet de n'importe quel type, mais il s'agit généralement d'un objet d'une classe d'exception. La bibliothèque standard C++ définit quelques classes d'exception de base, telles questd::exception、std::bad_alloc、std::bad_castetc.
Vous pouvez étendre les fonctionnalités de gestion des exceptions en définissant vos propres classes d'exception, ou utiliser les classes d'exception existantes de la bibliothèque standard pour gérer les scénarios d'exception courants.
Syntaxe
Lancer une exception
En C++, le mot-clé throw est utilisé pour lever une exception, avec la syntaxe suivante :
throw exception_object;
Intercepter les exceptions
Utilisez les mots-clés try et catch pour intercepter et gérer les exceptions, avec la syntaxe suivante :
try {
// 可能抛出异常的代码
} catch (exception_type e) {
// 处理异常的代码
}Vous pouvez spécifier le type d'exception à intercepter, ou utiliser un bloc catch générique pour intercepter tous les types d'exceptions :
try {
// 可能会抛出异常的代码
} catch (const std::exception& e) {
// 处理 std::exception 及其派生类的异常
} catch (...) {
// 处理所有其他类型的异常
}
std::exception
std::exception est une classe de base définie dans la bibliothèque standard C++ et sert de fondement à toutes les classes d'exception standard. Elle définit des fonctions virtuelles, telles que what(), qui renvoient une chaîne de style C décrivant les informations d'exception.
class exception {
public:
virtual const char* what() const noexcept;
};
Classes d'exception standard
La bibliothèque standard C++ fournit plusieurs classes d'exception dérivées de std::exception, telles que std::runtime_error, std::logic_error, etc., pour représenter des scénarios d'exception courants. Vous pouvez choisir la classe appropriée en fonction de la situation d'exception spécifique.
throw std::runtime_error("Runtime error occurred");
throw std::logic_error("Logic error occurred");
Exemple
Ce qui suit est une utilisation de<exception>Un exemple simple du fichier d'en-tête, montrant comment lever et intercepter des exceptions.
Exemple
#include <exception>
class MyException : public std::exception {
public:
const char* what() const throw() {
return "Mon exception personnalisée";
}
};
int main() {
try {
// simuler une condition d'erreur
bool error_condition = true;
if (error_condition) {
throw MyException();
}
} catch (const std::exception& e) {
std::cout << "Exception interceptée : " << e.what() << std::endl;
}
return 0;
}
Résultat de sortie :
Caught an exception: My custom exception
Classe d’exception
En C++, la bibliothèque standard fournit quelques classes d’exception courantes, qui héritent toutes destd::exception, et sont accessibles via#include <stdexcept>Inclure pour l’utiliser.
Voici quelques classes d’exception C++ courantes et leurs principaux objectifs :
-
std::exception: La classe de base de toutes les classes d’exception standard, définissant l’interface de base des exceptions. Elle possède une fonction virtuelle
what(), utilisée pour décrire les informations d’exception sous la forme d’une chaîne de style C. -
std::runtime_error: Indique une erreur d’exécution, généralement une exception causée par des problèmes de logique du programme, tels que des arguments invalides, l’impossibilité d’ouvrir des fichiers, etc.
throw std::runtime_error("Runtime error occurred"); -
std::logic_error: Représente des erreurs de logique, généralement des exceptions causées par des erreurs de logique du programme, telles que des échecs d’assertion logique et des indices hors limites.
throw std::logic_error("Logic error occurred"); -
std::invalid_argument: Indique qu’un argument passé à une fonction est invalide.
throw std::invalid_argument("Invalid argument"); -
std::out_of_range: Indique l’accès à un objet en dehors de sa plage valide, comme les tableaux et les conteneurs.
throw std::out_of_range("Out of range"); -
std::overflow_erroretstd::underflow_error: Indique un dépassement ou un sous-dépassement dans les calculs numériques.
throw std::overflow_error("Overflow occurred"); throw std::underflow_error("Underflow occurred"); -
std::bad_alloc: Indique un échec d'allocation mémoire.
throw std::bad_alloc(); // 内存分配失败时抛出
Exemple
#include <new> // inclure le fichier d'en-tête de l'exception std::bad_alloc
int main() {
try {
// tentative d'allocation d'une grande quantité de mémoire
int* largeArray = new int[1000000000000]; // Simuler un échec d'allocation mémoire
} catch (const std::bad_alloc& e) {
// Intercepter l'exception std::bad_alloc, afficher un message d'erreur
std::cerr << "Échec de l'allocation mémoire : " << e.what() << std::endl;
}
return 0;
}
Sortie :
Memory allocation failed: std::bad_alloc
Notes
- Les exceptions ne doivent pas être utilisées pour le flux de contrôle normal ; elles ne doivent être utilisées que pour gérer des situations exceptionnelles.
- La gestion des exceptions peut affecter les performances du programme, elle doit donc être utilisée avec prudence.
- Assurez-vous que
catchGérez tous les types d'exceptions possibles dans le bloc pour éviter que le programme ne plante en raison d'exceptions non gérées.
en utilisant<exception>Avec le fichier d'en-tête, les programmeurs C++ peuvent gérer plus efficacement les conditions d'erreur dans les programmes, ce qui améliore la robustesse et la fiabilité du programme.