[C++Builder] Problem mit eigener Exceptionklasse



  • c_Fehlerbearbeiter *fehlerbearbeiter;
    

    ist nur die Anlage eines Zeigers. Da passiert nix.

    Konstructoren werden bei new aufgerufen



  • so ganz scheinst du nicht zu verstehen, wie das exception-handling funktioniert?!

    int IntegerDivision(int a, int b)
    {
      // Konstruktor von c_Fehlerbearbeiter aufrufen und Exception generieren
      if (b == 0)
        throw c_Fehlerbearbeiter("Division durch 0 geht nicht!", "0", "", "IntegerDivision", "0");
    
      return (a / b);
    }
    
    void Rechne()
    { 
      try
      {
        int a = Division(4, 2); // alles ok
        int b = Division(4, 0); // löst Exception aus
      }
      catch(const c_Fehlerbearbeiter &ex)
      {
        ShowMessage("Exception aufgetreten von Typ c_Fehlerbearbeiter!");
    
        // Funktion der Exceptionklasse aufrufen um den Fehler in Datei zu schreiben
        ex.WriteErrorToFile();
      }
    }
    


  • Vielen Dank Sunday für das Beispiel. Ich steige erst neu in das ExceptionHandling ein.
    Aber grad noch mal zu deinem Beispiel. Hier ist es ja ein bekannter Fehler den du abfängst und dann ein "throw" definierst, denn du machst ja eine "if"- abfrage!

    Bei mir sollen die try+catch - Blöcke aber über größere Methoden gesetzt werden und deshalb möchte ich auch auf unerwartete Fehler reagieren können.
    Ist es nun sinnvoll über eine große Methode eine try+catch zu setzen oder ist es besser mehrere davon zu setzen??

    Damit man im Prinzip schon weiß welcher Fehler bei dem Programmteil auftreten kann.

    Was ich auch nocht nicht so ganz durch blicke ist, dass einige Komponenten ja eine eigene Methode für "Fehler" haben. Eine POP3-Komponente hat zum Beispiel das Ereignis "OnAuthentificationFailed" vordefiniert. Wenn jetzt dieser Fall eintritt, dass die Anmeldung fehlschlägt, springt das Programm ja immer in diese Methode, oder?? Denn da könnte ich ja ein "throw" definieren und dann wäre das Problem an sich gelöst. Doch das heißt, das ich jedes Ereigniss einer Komponente kennen müsste um alle Fälle abzudecken, oder?

    Ist das der gängige Weg??



  • Hallo

    [quote]Bei mir sollen die try+catch - Blöcke aber über größere Methoden gesetzt werden und deshalb möchte ich auch auf unerwartete Fehler reagieren können.
    Ist es nun sinnvoll über eine große Methode eine try+catch zu setzen oder ist es besser mehrere davon zu setzen?? [/cpp]
    Du kannst mehrere catch-Blöcke mit verschiedenen Exception-Typen aneinanderhängen. Das fängt meistens bei sehr speziellen Typen an, und hört bei Exception selber auf.

    Was ich auch nocht nicht so ganz durch blicke ist, dass einige Komponenten ja eine eigene Methode für "Fehler" haben. Eine POP3-Komponente hat zum Beispiel das Ereignis "OnAuthentificationFailed" vordefiniert. Wenn jetzt dieser Fall eintritt, dass die Anmeldung fehlschlägt, springt das Programm ja immer in diese Methode, oder?? Denn da könnte ich ja ein "throw" definieren und dann wäre das Problem an sich gelöst. Doch das heißt, das ich jedes Ereigniss einer Komponente kennen müsste um alle Fälle abzudecken, oder?

    Auch alle Indy-Exceptions sind von Exception abgeleitet. Und bei den meistens Funktionen, die gezielt Expetions benutzen, steht es dann auch abei, welcher Typ bei welcher Situation geworfen wird.

    bis bald
    akari



  • Vielen Dank schon mal für die Hilfe!

    Gruß



  • Noch eine Sache:

    Wenn eine Exception ausgelöst wird, dann kommt ja meistens diese Fehlermeldung:

    Im Projekt xxxx ist eine Exception der Klasse yyyyy aufgetreten. Meldung:
    'zzzzzz'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start
    fortsetzen.

    Wie man an die Klasse yyyyy heran kommt ist mir klar, doch wie komm ich an die Meldung: 'zzzzzz' ???

    wenn ich folgenden catch-Block habe

    catch(Exception &e)
    {
     e.Message;
     e.ClassName;
    
    }
    

    bekomm ich in beiden Fällen die gleichen Werte! (Der Fehler ist eine EDivByZiro in meinem Fall)

    Doch bei der Exception-Message des BCB bekomm ich bei Klasse: EDivByZiro und bei Meldung: 'Division durch Null' angezeigt und diese Meldung würde ich auch gerne bekommen! Wie kann ich daran kommen?

    Gruß



  • Programm nicht in der IDE ausführen...



  • Also liegt es an dem Debugger? Wie kann ich denn diese ganzen Nachrichten einer Exception-Klasse herausfinden?



  • Es gibt nur die Nachrichten, die in den Membervariablen der entsprechenden Exceptionklasse drin sind. Alles andere wird vom Debugger hinzugefügt, und das kannst du nicht auslesen.
    BTW, du brauchst Datei, Funktion und Zeilennummer eigentlich nicht unbedingt mitzugeben. Da existieren fertige Makros. sieh mal nach __LINE__ __FILE__ __FUNC__



  • Die __LINE__, __FILE__, und __FUNC__ benutz ich schon!

    Aber trotzdem danke!


Anmelden zum Antworten