Entwickler-Ecke
Internet / Netzwerk - IdTCPClient Fehlermeldungen
rockzOr - Fr 02.05.08 13:16
Titel: IdTCPClient Fehlermeldungen
Ok, dann hier eben ein neuer Thread ;)
Wie fange ich am besten die Fehlermeldungen vom IdTCPClient ab ohne dass mein Programm gleich haengen bleibt (bzw einfach nichts mehr tut nach der Meldung). Es sollte ja in meinem Fall nur 2 Meldungen geben.
1. Connect timed out.
2. Socket Error # 10061 Connection refused.
Ersteres sollte der Server mal zu langsam reagieren (was wohl nicht vorkommen wird ausser er ist off) und Letzteres eben wenn der Port nicht offen ist.
Yogu - Fr 02.05.08 14:46
Hallo,
bei einem Fehler wird eine Exception ausgelöst. Diese kannst du abfangen, und auf die erwarteten Fehler prüfen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| try IdTCPClient.Connect; except on E: DeineException do begin end; on E: DeineAndereException do begin end; else raise; end; |
Wie die einzelnen Exceptions für die Indy-Fehler heißen, weiß ich gerade nicht. Das könntest du im Soruce nachschauen.
Grüße,
Yogu
rockzOr - Fr 02.05.08 14:56
Hallo,
danke, das hat mir schonmal sehr viel weiter geholfen.
Nur wie kann ich das im Source nachschauen? Ich finde nur .dcu Dateien und die kann ich etwas schwer lesen.
Yogu - Fr 02.05.08 15:02
Die Indy-Units liegen eigentlich als PAS-Dateien vor. Schaue einfach mal im Verzeichnis von Indy nach den Dateien, und durchsuche die. Alternativ könntest du es auch einfach mal knallen lassen, und schauen, welche Exception-Klasse Delphi meldet. Dann suchst du in den Units nach diesem Namen, und schaust, wo die Exception definiert ist. Diese Unit musst du dann noch einbinden.
rockzOr - Fr 02.05.08 15:11
Also .pas Dateien von den Indy Komponenten finde ich keine (Suche auf allen Laufwerken).
Kann mir Delphi nicht selber sagen, welche Exception es grad geworfen hat?
Beim starten aus Delphi selbst heraus seh ich nur:
[...] raised an exception class EIdNotASocket with message 'Socket Error # 10038 Socket operation on non-socket.'.
was mich schon sehr verwundert, da das keine wirkliche Fehlermeldung erzeugt im Programm selbst und dann eben die die ich erwarte:
[...] raised an exception class EIdConnectTimeout with message 'Connect timed out'.
Allerdings meckert mir Delphi selbst die E* Sachen an wenn ich die verwenden moechte.
Yogu - Fr 02.05.08 15:26
rockzOr hat folgendes geschrieben: |
| Also .pas Dateien von den Indy Komponenten finde ich keine (Suche auf allen Laufwerken). |
Das ist komisch. Hast du nach
Id*.pas gesucht? Sonst kannst du dir Indy ja
runterladen [
http://www.indyproject.org].
rockzOr hat folgendes geschrieben: |
| Allerdings meckert mir Delphi selbst die E* Sachen an wenn ich die verwenden moechte. |
Das liegt daran, dass du die Unit noch nicht eingebunden hast, in der die Exceptions definiert sind. In deinem Fall ist die Exception
EIdNotASocket in "IdStackBSDBase", und
EIdConnectTimeout in "IdExceptionCore". Binde einfach diese beiden Units ein.
rockzOr - Fr 02.05.08 15:36
Hi. Also ich habs jetzt iwie mal bischen mit rumexperimentieren versucht und folgendes Phaenomen:
Mein Code sieht nun wiefolgt aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| try
IdTCPClient1.Connect; except on E: EIdConnectTimeout do begin end;
else end; if idtcpclient1.connected = true then
begin
form1.image17.visible := true;
form1.image18.visible := false;
timer3.enabled := true;
label1.Caption := 'Hole Daten...';
end
else
begin
form6.label1.caption := 'Verbindung fehlgeschlagen...';
form1.image17.visible := false;
form1.image18.visible := true;
timer1.enabled := true;
end;
idtcpclient1.Disconnect; |
Wenn ich das via Delphi-Start-Button aufrufe funktioniert es. Ich habe testweise das ConnectionTimeout auf 1 gesetzt (also 1 Millisekunde) und er bricht dann mit einer Exception Delphi-Intern ab, zeigt aber keinen Fehler (das was ich will) sondern eben das Ereigniss wenn idtcpclient1.connected false ist. Wenn ich das Timeout auf den Finalen Wert setze (also 5 Sekunden) dann wird alles erfolgreich ausgefuehrt.
Wenn ich das Projekt aber jetzt kompiliere und baue und dann die .exe Datei aufrufe, ist es auch mit 1 Millisekunden Timeout IMMER auf Connected (also es kommt nie zu dem Fall des Timeouts). Das versteh ich irgendwie beim besten Willen nicht :?
Yogu - Fr 02.05.08 15:44
Schreib doch einfach die Fehlerbehandlung bei der Exception rein.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| try
IdTCPClient1.Connect; except on E: EIdConnectTimeout do begin form6.label1.caption := 'Verbindung fehlgeschlagen...'; form1.image17.visible := false; form1.image18.visible := true; timer1.enabled := true;
Exit; end;
else raise; end;
form1.image17.visible := true; form1.image18.visible := false; timer3.enabled := true; label1.Caption := 'Hole Daten...';
idtcpclient1.Disconnect; |
rockzOr - Fr 02.05.08 16:04
Hey danke, das funktioniert sogar ;)
Das raise; lass ich mit absicht raus, weil ich eben keine anderen Fehler da sehen moechte ;) Die User sind teilweise zu daemlich um damit umgehen zu koennen, deswegen teste ich alle moeglichen Szenarien vorher durch und alles andere brauch ich ja nicht ^^ Gibt ja nur wenige moegliche Dinge. Entweder es geht oder eben nicht -> woran das dann liegt ist ja egal. Kann am Inet des Users, am Server, am Routing oder sonstwas liegen, das beeintraechtigt aber nicht die Funktion des Programms (ist ja nur eine Online/Offline Anzeige als Teil des ganzen).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!