Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann ich die genaue Quelle nicht behandelter Ausnahmen in C identifizieren?

Patricia Arquette
Freigeben: 2024-11-18 12:18:02
Original
746 Leute haben es durchsucht

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

Identifizieren der genauen Quelle nicht behandelter Ausnahmen

Bei der Programmierung treten häufig Ausnahmesituationen auf, die Ausnahmen auslösen, die den normalen Ausführungsfluss stören. Während es im Allgemeinen einfach ist, die Quelle von Ausnahmen zu bestimmen, die Sie absichtlich generieren, kann es schwierig sein, den Ursprung nicht behandelter oder von externen Systemen generierter Ausnahmen aufzuspüren.

Ein Ansatz besteht darin, sich auf die integrierten Informationen der Ausnahme zu verlassen. Dies kann einen Zeiger auf die Zeile und die Quelldatei enthalten, die für den Fehler verantwortlich sind. Allerdings sind diese Informationen nicht immer in allen Szenarien verfügbar oder zuverlässig.

Um diese Einschränkung zu beheben, sollten Sie die Verwendung einer benutzerdefinierten Ausnahmeklasse in Betracht ziehen, die sowohl die ursprüngliche Ausnahme als auch die Quellinformationen kapselt. Dies ermöglicht Ihnen eine umfassende und benutzerfreundliche Behandlung von Ausnahmen und die Bereitstellung präziser Details zu deren Ursprung.

So implementieren Sie eine solche benutzerdefinierte Ausnahmeklasse:

#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();
    }
};
Nach dem Login kopieren

Sobald Sie benutzerdefinierte sind Wenn die Ausnahmeklasse vorhanden ist, können Sie ein Makro verwenden, um Ausnahmen mit Quellinformationen auszulösen:

#define throw_line(arg) throw my_exception(arg, __FILE__, __LINE__);
Nach dem Login kopieren

Dieses Makro kann wie folgt verwendet werden:

void f() {
    throw_line("Oh no!");
}
Nach dem Login kopieren

Wenn eine Ausnahme mit ausgelöst wird Mit diesem Makro speichert die Klasse my_Exception automatisch die Quellinformationen, einschließlich Dateiname und Zeilennummer.

Jetzt zeigen wir, wie Ausnahmen mit dieser benutzerdefinierten Klasse behandelt werden:

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

Von Mithilfe der Funktion what() der benutzerdefinierten Ausnahmeklasse können Sie eine detaillierte Fehlermeldung erhalten, die die ursprünglichen Quellinformationen enthält, was eine präzise Fehlerdiagnose und -lösung ermöglicht.

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

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage