[C++Builder] Problem mit eigener Exceptionklasse
-
Hallo,
Ein Konstruktor könnte so aussehen
class c_Fehlerbearbeiter : public Exception { private: AnsiString m_asFehlerNachricht; AnsiString m_asFehlerCode; AnsiString m_asFehlerDatei; AnsiString m_asFehlerFunktion; AnsiString m_asFehlerZeile; public: c_Fehlerbearbeiter(AnsiString asn, AnsiString asc, AnsiString asd, AnsiString asf, AnsiString asz) : Exception(asn), m_asFehlerNachricht(asn), m_asFehlerCode(asc), m_asFehlerDatei(asd), m_asFehlerFunktion(asf), m_asFehlerZeile(asz) {} };Diese SetDefault Funktion brauchst du doch nicht. Dafür brauchst du aber Zugriffsfunktionen auf deine Variablen.
-
Morgen,
wenn ich jetzt deinen Konstruktor verwende, dann kommt trotzdem der gleiche Fehler heraus.
Ich möchte eigentlich erreichen, dass wenn in meinem Programm eine Exception geschmissen wird, dass dann im catch()-Block die Methode
void bearbeiteFehler(AnsiString, AnsiString, AnsiString, AnsiString, AnsiString );aufgerufen wird. In dieser Methode soll dann der Fehler in ein LogFile geschrieben werden und es sollen verschiedene Sachen gemacht werden. Das Problem ist halt, das ich den AnsiString - Variablen keine Werte zuweisen kann.
Der Konstruktor wir doch dann aufgerufen, wenn ein Objekt der Klasse erzeugt wird, oder?
Also in meinem Hauptprogramm:
c_Fehlerbearbeiter *fehlerbearbeiter;Doch die Zuweisungen mit den AnsiString - Variablen kann doch dann noch nicht statt finden, weil noch keine Werte dafür vorhanden sind, oder??
Kann das von meiner Überlegung überhaupt funktionieren, dass ich die Methode
bearbeiteFehler(AnsiString, AnsiString, AnsiString, AnsiString, AnsiString );aufrufe und das die übergebenen Werte den Attributen der Klasse zugewiesen werden??
Vielen Dank für die Antworten
Gruß
-
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!