Entwickler-Ecke

Internet / Netzwerk - IndyKomponenten - Fehlerbehandlung?


Passi077 - So 03.06.07 12:18
Titel: IndyKomponenten - Fehlerbehandlung?
Hi,

ich arbeite seit kurzer Zeit mit den Indy Komponenten, und es funktioniert bisher alles ganz gut :)

Aber ich habe ein Problem:
Wenn z.B. eine Zeitüberschreitung, oder ein anderer Fehler eintritt (auch z.B. Weiterleitungen, oder andere HTTP Fehler (404, 302 etc.), schmiert mir gleich das gesamte Programm ab mit einer idHTTP Komponente..

Leider habe ich nichts gefunden, wie ich die Fehler bearbeiten und auswerten kann. Könnt Ihr mir helfen?

Danke + Grüße
Passi


Narses - So 03.06.07 14:41

Moin!

Probier mal mit try-except-end herum, damit solltest du das in den Griff kriegen. Hinweis: in der IDE werden - wenn man es nicht explizit abschaltet - trotzdem die Exceptions angezeigt (was auch sinnvoll ist), wenn man das Programm ohne die IDE startet, wird keine Exception angezeigt.

cu
Narses


Master_of_Magic - So 03.06.07 15:48

Um noch etwas konkreter zu werden, geb ich mal ein Anwendungsbeispiel:

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:
try
    FResult.Text := HTTP.Post(url, params);
    HTTP.Disconnect;
    FResponseCode := HTTP.ResponseCode;
  except
    on E: EIdHTTPProtocolException do
    begin
      FResponseCode := E.ErrorCode;
      FResult.Text := E.Message;
      //hier könnte man auch mit case einzelnen ErrorCodes (z.B. 404 explizit abfangen) - ich mache das in einer späteren Funktion
    end;
    on E: EIdSocketError do
    begin
      FResponseCode := E.LastError;
      case E.LastError of
        10060:
          begin
            FResult.Text := 'Der Server hat nicht in der vorgegebenen Zeitspanne geantwortet. Eventuell ist er überlastet oder es gibt Probleme mit deiner Internetverbindung.'+' Bitte überprüfe, ob du korrekt mit dem Internet verbunden bist und keine Firewall oder Router die Verbindung verhindert. Versuche es dann in ein paar Minuten erneut.';
          end;
        11004:
          begin
            FResult.Text := 'Der Server existiert zwar, ist jedoch nicht erreichbar, da die Namensauflösung fehlgeschlagen ist. Bitte überprüfe, ob du korrekt mit dem Internet verbunden bist und keine Firewall oder Router die Verbindung verhindert. Versuche es dann erneut.';
          end;
      else
        begin
          FResult.Text := Format('Beim Aufbau der Verbindung ist ein Fehler aufgetreten. Der genaue Fehlertext ist:'#13#10#13#10'%s',
            [E.Message]);
        end;
      end;
    end;
    on E: EIdexception do
    begin
      FResult.Text := Format('Beim Aufbau der Verbindung ist ein %s Fehler aufgetreten. Der genaue Fehlertext ist:'#13#10#13#10'%s',
        [E.ClassName, E.Message]);
    end;
  end;

Klappt bei mir prima. Und du hast in jedem Fall in FResponseCode den Fehlercode (oder 200) und in FResponseText die Meldung. Damit kannst du später weiterarbeiten.

:!: HINWEIS: Indy wirft bei "401 - Authorization required" nur beim ersten mal eine Exception! Gibst du ein falsches Passwort an, ist die Response zwar auch weiterhin 401, es wird jedoch keine Exception ausgelöst!


Passi077 - So 03.06.07 16:58

Hi,

Danke für Eure Hilfe!

Leider kennt meine Indy Version sowohl EIdSocketError als auch EIdexception nicht (Bezeichner unbekannt).. habe schon in der Indy Doku gesucht, aber da steht nichts von Versionsabhängigkeit.

Habe Indy9.. brauch ich die 10er?
Oder weiß jemand, wie ich diese 2 Exceptions dort handeln kann?

Danke + Grüße
Passi


Master_of_Magic - So 03.06.07 17:22

Ah, du musst noch die richtige Unit einbinden. Ich glaub

Delphi-Quelltext
1:
uses IdStack, IdException                    

sind die beiden. Evtl. reicht auch nur die IdStack.

Da ich Indy10 hab, kann ich nicht 100% sagen, wie die Unit in Indy9 heißt ... probier einfach die beiden mal aus.