Maison >développement back-end >C++ >Comment puis-je identifier la source des exceptions non gérées dans mon code ?

Comment puis-je identifier la source des exceptions non gérées dans mon code ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-16 15:33:03410parcourir

How can I pinpoint the source of unhandled exceptions in my code?

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!

Déclaration:
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