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

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

Patricia Arquette
Libérer: 2024-11-16 15:33:03
original
340 Les gens l'ont consulté

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

Lors de l'exécution de ce code, le résultat est :

myFile.cpp:20: Oh no!
Copier après la connexion

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!

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