Maison > développement back-end > C++ > le corps du texte

Comment puis-je identifier la source exacte des exceptions non gérées en C ?

Patricia Arquette
Libérer: 2024-11-18 12:18:02
original
746 Les gens l'ont consulté

How Can I Identify the Exact Source of Unhandled Exceptions in C  ?

Identifier la source exacte des exceptions non gérées

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();
    }
};
Copier après la connexion

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__);
Copier après la connexion

Cette macro peut être utilisée comme suit :

void f() {
    throw_line("Oh no!");
}
Copier après la connexion

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;
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal