Identifier la source des exceptions non gérées
Dans le domaine de la gestion des exceptions, la capacité d'identifier la cause première d'une exception est primordiale. Bien qu'il soit assez simple d'inclure des informations supplémentaires lors de la création d'exceptions, il peut être difficile de déterminer la ligne exacte de code d'où proviennent les exceptions non gérées ou externes.
Classes et macros personnalisées à la rescousse
Une solution efficace réside dans l’utilisation de classes d’exceptions et de macros personnalisées. Nous pouvons définir une classe d'exception personnalisée, my_exception, qui étend le standard std::runtime_error. Au sein de cette classe, nous initialisons un message avec le nom de fichier de l'exception, le numéro de ligne et le message d'erreur d'origine.
Ensuite, nous créons une macro, throw_line(), qui prend un argument et lance une my_exception avec le information. Cette macro simplifie le processus de génération d'exceptions qui incluent un contexte d'erreur détaillé.
Démonstration :
Considérons l'exemple de code suivant :
#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__); void f() { throw_line("Oh no!"); } int main() { try { f(); } catch (const std::runtime_error &ex) { std::cout << ex.what() << std::endl; } }
Lors de l'exécution de ce code, le résultat est :
myFile.cpp:20: Oh no!
Comme vous pouvez le voir, il fournit un message d'erreur détaillé qui inclut le nom exact du fichier, le numéro de ligne et l'argument d'exception. Ces informations simplifient grandement le débogage et permettent une analyse efficace des causes profondes.
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!