Funktions- und Klassennamen automatisch in Exception einbauen



  • Hallo,

    kurze Frage:
    Gibt es eine Möglichkeit, exceptions zu automatisieren, so dass sie erkennen, von welcher Klassen und von welcher Funktion sie aufgerufen werden?

    also z.B.

    int KlasseA::berechne_eine_zahl(const int & parameter)
    {
    //...Blablabla
    
    //Ein Fehler tritt auf, meine Fehlerklasse CFehler bekommt einen Fehlertext, den Namen der aufrufenden Klasse und der Funktion
    throw CFehler("Fehler: Parameter ungueltig!", "KlasseA","berechne_eine_zahl");
    
    //...Blablabla
    return ergebnis;
    }
    

    Wenn ich den Namen der Funktion ändere muss ich daran denken, auch alle Exceptions entsprechend abzuändern. Ist das nicht eleganter möglich?

    Danke.



  • Hoi,
    Also die einzige Möglichkeit, eine Funktion 'zu intetifizieren' ist, soweit ich weiß nur ihre Adresse im Hauptspeicher...und die dürfte dir in diesem Fall wohl nicht großartig weiterhelfen...

    Was mit dennoch einfällt:
    Du kannst doch bspw so etwas machen:

    // Anzahl aller Funktionen, deren Namen gespeichert werden sollen:
    #define NUMBER_OF_FUNCTIONS   (100)
    
    // jder Funktion eine ID geben, die gleichzeitig als Array-Index dient:
    #define FKT_berechne_eine_zahl  (0)
    
    // alle Namen in nem Array (z.B.: global):
    std::string strFuncNameTab[NUMBER_OF_FUNCTION] = { "berechne_eine_zahl", /*usw. ...*/ };
    
    int KlasseA::berechne_eine_zahl(const int & parameter)
    {
    //...Blablabla
    
    //Ein Fehler tritt auf, meine Fehlerklasse CFehler bekommt einen Fehlertext, den Namen der aufrufenden Klasse und der Funktion
    throw CFehler("Fehler: Parameter ungueltig!", "KlasseA",strFuncNameTab[FKT_berechne_eine_zahl]);
    
    //...Blablabla
    return ergebnis;
    }
    

    so müsstest du rein theoretisch nur den Inhalt des Arrays und der Funktion selbst anpassen...

    Tjo...mehr fällt mir auch nicht ein... 🤡



  • Man kann automatisch Dateiname und Zeilennummer übergeben lassen. Das müsste doch schon reichen!



  • Also in VC gibts nen paar zusätzliche Makros neben __LINE__ und __FILE__ unter anderem ein __FUNCTION__ (und rate mal was es macht).
    Den Klassennamen kannste zumindest mit einem typeid(Klasse).name() rausfinden, erfordert aber, dass RTTI aktiviert wird.
    Außerdem ist die Art wie eine Klasse angegeben wird nicht festgelegt, aber ein normaler Compiler spuckt zumindest den Namen mit aus. (Der VC hängt aber überall noch ein "class" an, also statt Foo steht dann da "class Foo")



  • line schrieb:

    Man kann automatisch Dateiname und Zeilennummer übergeben lassen. Das müsste doch schon reichen!

    jo, dafür gibt es folgende Makros:

    - Für den Dateinamen: __FILE__
    
    - Für Zeilennummer: __LINE__
    
    - Für das Compilierungdatum: __DATE__
    
    - Für die Compilierungszeit: __TIME__
    

    das wären die wichtigsten...



  • Danke 🙂


Anmelden zum Antworten