Autor Beitrag
rockzOr
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Fr 02.05.08 13:16 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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:

ausblenden 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
    {Behandle die Exception}
  end;
  on E: DeineAndereException do
  begin
    {Behandle die Exception}
  end;
  else
    raise;   // Alle anderen Exceptions melden
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 02.05.08 15:26 
user profile iconrockzOr 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.

user profile iconrockzOr 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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:

ausblenden volle Höhe 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;
{  on E: DeineAndereException 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 02.05.08 15:44 
Schreib doch einfach die Fehlerbehandlung bei der Exception rein.

ausblenden volle Höhe 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
    // Hier kommst du rein, Timeout auftritt.
    form6.label1.caption := 'Verbindung fehlgeschlagen...';
    form1.image17.visible := false;
    form1.image18.visible := true;
    timer1.enabled := true;

    // Prozedur verlassen
    Exit;
  end;
{  on E: DeineAndereException do
  begin
  end;
}

  else
    // Das hier ist GANZ WICHTIG, weil sonst andere Fehler nicht mehr gemeldet werden.
    raise;
end;

// Hier sind wir nur noch, wein kein Fehler aufgetreten ist
form1.image17.visible := true;
form1.image18.visible := false;
timer3.enabled := true;
label1.Caption := 'Hole Daten...';

idtcpclient1.Disconnect;
rockzOr Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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).