Détermination de l'origine des exceptions non gérées
Dans la gestion des exceptions, il est courant d'inclure des numéros de ligne et des noms de fichiers source pour identifier la cause de une exception. Lorsque les exceptions sont générées manuellement, ces informations peuvent être facilement ajoutées. Cependant, les exceptions non gérées et celles qui ne sont pas explicitement levées peuvent présenter un défi.
Utiliser une classe d'exception personnalisée avec des macros
Pour surmonter cette limitation, une solution plus robuste consiste à utilisez une classe d’exception personnalisée et une macro. Le code C suivant illustre comment cela peut être réalisé :
#include <iostream> #include <sstream> #include <stdexcept> #include <string> class my_exception : public std::runtime_error { std::string msg; public: my_exception(const std::string &arg, const char *file, int line) : std::runtime_error(arg) { std::ostringstream o; o << file << ":" << line << ": " << arg; msg = o.str(); } ~my_exception() throw() {} const char *what() const throw() { return msg.c_str(); } }; #define throw_line(arg) throw my_exception(arg, __FILE__, __LINE__);
Exemple d'utilisation
Avec la classe d'exception personnalisée et la macro en place, les exceptions non gérées peuvent être capturées et leur source identifiée :
void f() { throw_line("Oh no!"); } int main() { try { f(); } catch (const std::runtime_error &ex) { std::cout << ex.what() << std::endl; } }
Lorsque ce code est exécuté, le message d'erreur suivant est imprimé :
myFile.cpp:255: Oh no!
Ceci identifie clairement le fichier et le numéro de ligne où l'exception a été levée, en fournissant informations précieuses pour le débogage et la résolution du problème.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!