[C++Builder] Exception richtig werfen
-
Hallo zusammen,
ich möchte einen bestimmten Fehler abfangen. Hier mal mein Code:
void __fastcall TForm1::Button1Click(TObject *Sender) { try { if (NMPOP31->Connected) NMPOP31->Disconnect(); else { NMPOP31->Host = "mail.gmx.net"; NMPOP31->UserID = "root"; NMPOP31->Password = "password"; NMPOP31->Connect(); } } catch(Exception &e ) { Label1->Caption = e.Message; } } //--------------------------------------------------------------------------- void __fastcall TForm1::NMPOP31ConnectionFailed(TObject *Sender) { AnsiString Fehler = "E400"; throw Exception(Fehler); }
Nun habe ich das folgende Programm so programmiert, dass genau der Fehler auftritt, den ich abfangen möchte.
Ich benutze eine NMPOP3- Komponente zum Emailempfang. diese Komponente hat ein Ereignis definiert "OnAuthentificatinoFailed()" dass wenn das Einwählen beim Mailserver nicht funktioniert, dass das Programm dann in dieses Ereignis springt.Nun habe ich in diesem Ereignis ein throw definiert. Damit das Programm in den dafür vorgesehenen catch Teil springt. Dabei soll der AnsiString Fehler = "E400" übergeben werden. Und diesen AnsiString möchte ich mir gerne in einem Label anzeigen lassen!! Kann mir jemand sagen, wie ich das mache???
Denn mir e.Message wird jetzt nur ein Standardtext "AuthentificationFailed" ausgegeben!
2. Frage:
Können noch mehr Parameter bei throw Exception (Parameter1, parameter2 ...) übergeben werden?
Ist dieses "Exception" eine vordefinierte Exceptionklasse?
3. Frage:
Kann man meine Lösung vielleicht besser lösen?? Bin absoluter Anfänger was Fehlerbehandlung und so angeht!
Vielen Dank für die Antworten!
Gruß
-
Hallo
Du redest davon, OnAuthenticationFailed anfangen zu wollen, aber in deinem Codeausschnitt verwendest du den Event OnConnectionFailed. Dies ist nicht dasselbe.
Du kannst von Exception selber eine neue Klasse ableiten, die dann deine gewünschten parameter übernimmt.
Mit catch(MyException) kannst du dann genau deinen eigenen Exception-Typ filtern.Warum fängst du denn die Error-Events ab, nur um dann eigene Exceptions zu werfen?
Es werden bei unbehandelten Events doch eh Exceptions geworfen, die du abfangen und filtern kannst.
Die Events selber sind zur direkten Fehlerbehandlung gedacht.bis bald
akari
-
Warum fängst du denn die Error-Events ab, nur um dann eigene Exceptions zu werfen?
Es werden bei unbehandelten Events doch eh Exceptions geworfen, die du abfangen und filtern kannst.
Die Events selber sind zur direkten Fehlerbehandlung gedacht.Danke schon mal für deine Antwort!
Ich habe für das Projekt eine eigene Klasse "Fehlerbearbeiter" definiert mit der alle Fehler bearbeitet werden sollen. Dabei wird nach einem Fehler ein bestimmter (von mir vorgegebener Fehlercode) an den Fehlerbaerbeiter gegeben und dieser weiß dann genau, was mit diesem Fehler zu machen ist!
Ist das so elegant?
bzw. ich soll es mit so einem Fehlerbearbeiter lösen und habe mir eben diese Strategie die ich im oberen Teil schon erklärt habe ausgedacht!Kannst du mir vielleicht gerade zeigen, wie ich über ein throw paramater verschicken kann?
Danke!
-
Hallo
zuerst definierst du deine neue Exception-Klasse mit allen gewünschten Parametern
class MyException : public Exception { private : AnsiString iText; int iWert; public : AnsiString GetText() const {return iText;}; int GetWert() const {return iWert;}; MyException(AnsiString Text, int Wert) : Exception(""), iText(Text), iWert(Wert) {}; };
Dann kannst du diese so einsetzen
try { throw MyException("Mein Text", 100); // Spezielle Exception werfen } catch(MyException &e) // Behandlung für MyException { AnsiString Text = e.GetText(); Text += " " + IntToStr(e.GetWert()); ShowMessage(Text); } catch(Exception &e) // Behandlung für alle anderen VCL-Exceptions { Application->ShowException(&e); }
bis bald
akari
-
Vielen Dank!
Ich glaube, dass bringt mich weiter.