En programmation, des situations exceptionnelles se produisent souvent, déclenchant des exceptions qui perturbent le flux normal d'exécution. Bien qu'il soit généralement simple d'identifier la source des exceptions que vous générez intentionnellement, retrouver l'origine de celles non gérées ou de celles générées par des systèmes externes peut s'avérer difficile.
Une approche consiste à s'appuyer sur les informations intégrées de l'exception, qui peut inclure un pointeur vers la ligne et le fichier source responsables de l'erreur. Cependant, ces informations ne sont pas toujours disponibles ou fiables dans tous les scénarios.
Pour résoudre cette limitation, envisagez d'utiliser une classe d'exception personnalisée qui encapsule à la fois l'exception d'origine et les informations source. Cela vous permet de gérer les exceptions de manière complète et conviviale, en fournissant des détails précis sur leurs origines.
Voici comment implémenter une telle classe d'exception personnalisée :
#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(); } };
Une fois votre classe d'exception est en place, vous pouvez utiliser une macro pour lancer des exceptions avec les informations source :
#define throw_line(arg) throw my_exception(arg, __FILE__, __LINE__);
Cette macro peut être utilisée comme suit :
void f() { throw_line("Oh no!"); }
Lorsqu'une exception est déclenchée à l'aide cette macro, la classe my_exception stockera automatiquement les informations source, y compris le nom du fichier et le numéro de ligne.
Montrons maintenant comment gérer les exceptions à l'aide de cette classe personnalisée :
int main() { try { f(); } catch (const std::runtime_error &ex) { std::cout << ex.what() << std::endl; } }
Par en utilisant la fonction what() de la classe d'exception personnalisée, vous pouvez obtenir un message d'erreur détaillé qui inclut les informations sur la source d'origine, permettant un diagnostic et une résolution précis des erreurs.
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!