Maison >développement back-end >C++ >Comment identifier l'origine des exceptions non gérées en C ?

Comment identifier l'origine des exceptions non gérées en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-16 17:48:03331parcourir

How to Pinpoint the Origin of Unhandled Exceptions in C  ?

Détermination de l'origine des exceptions non gérées

Dans la gestion des exceptions, il est courant d'inclure des numéros de ligne et des noms de fichiers source pour identifier la cause de une exception. Lorsque les exceptions sont générées manuellement, ces informations peuvent être facilement ajoutées. Cependant, les exceptions non gérées et celles qui ne sont pas explicitement levées peuvent présenter un défi.

Utiliser une classe d'exception personnalisée avec des macros

Pour surmonter cette limitation, une solution plus robuste consiste à utilisez une classe d’exception personnalisée et une macro. Le code C suivant illustre comment cela peut être réalisé :

#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__);

Exemple d'utilisation

Avec la classe d'exception personnalisée et la macro en place, les exceptions non gérées peuvent être capturées et leur source identifiée :

void f() {
    throw_line("Oh no!");
}

int main() {
    try {
        f();
    }
    catch (const std::runtime_error &ex) {
        std::cout << ex.what() << std::endl;
    }
}

Lorsque ce code est exécuté, le message d'erreur suivant est imprimé :

myFile.cpp:255: Oh no!

Ceci identifie clairement le fichier et le numéro de ligne où l'exception a été levée, en fournissant informations précieuses pour le débogage et la résolution du problème.

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