Heim >Backend-Entwicklung >C++ >Wie kann ich die Quelle nicht behandelter Ausnahmen in meinem Code ermitteln?

Wie kann ich die Quelle nicht behandelter Ausnahmen in meinem Code ermitteln?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-16 15:33:03400Durchsuche

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

Identifizieren der Quelle nicht behandelter Ausnahmen

Im Bereich der Ausnahmebehandlung ist die Fähigkeit, die Grundursache einer Ausnahme zu ermitteln, von größter Bedeutung. Während es ziemlich einfach ist, beim Erstellen von Ausnahmen zusätzliche Informationen einzubeziehen, kann es schwierig sein, die genaue Codezeile zu bestimmen, aus der nicht behandelte oder externe Ausnahmen stammen.

Benutzerdefinierte Klassen und Makros zur Rettung

Eine effektive Lösung liegt in der Verwendung benutzerdefinierter Ausnahmeklassen und Makros. Wir können eine benutzerdefinierte Ausnahmeklasse, my_Exception, definieren, die den Standard std::runtime_error erweitert. Innerhalb dieser Klasse initialisieren wir eine Nachricht mit dem Dateinamen der Ausnahme, der Zeilennummer und der ursprünglichen Fehlermeldung.

Als nächstes erstellen wir ein Makro, throw_line(), das ein Argument entgegennimmt und eine my_Exception mit dem entsprechenden auslöst Information. Dieses Makro vereinfacht den Prozess des Auslösens von Ausnahmen, die einen detaillierten Fehlerkontext enthalten.

Demonstration:

Betrachten wir den folgenden Beispielcode:

#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;
    }
}

Wenn Sie diesen Code ausführen, lautet die Ausgabe:

myFile.cpp:20: Oh no!

Wie Sie sehen können, wird eine detaillierte Fehlermeldung angezeigt Dazu gehören der genaue Dateiname, die Zeilennummer und das Ausnahmeargument. Diese Informationen vereinfachen das Debuggen erheblich und ermöglichen eine effiziente Ursachenanalyse.

Das obige ist der detaillierte Inhalt vonWie kann ich die Quelle nicht behandelter Ausnahmen in meinem Code ermitteln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn