AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei Indy abfangen

Ein Thema von moritz · begonnen am 1. Jan 2004
Antwort Antwort
moritz

Registriert seit: 18. Apr 2003
1.037 Beiträge
 
#1

Fehler bei Indy abfangen

  Alt 1. Jan 2004, 16:12
Hallo

Die, die sich schon mit Indy beschäftigt haben, wissen sicher um diese doofen Fehlermeldungen, die Indy immer bringt statt ein OnError - Event auszulösen. Ich hab mich mal damit beschäftigt und das Problem gelöst. Ich will euch nun erklären, wie ihr einen Indy-Fehler zu einem OnError-Ereignis macht.
(Die Anleitung geht von D7 und dem dort vorinstallierten Indy aus. Es kann sein dass das bei euch etwas abweicht)

Voraussetzung: Indy ist installiert
  • Schritt 1: Sicherheitskopie der IdException.pas anlegen (evtl. auch IdException.dcu)
  • Schritt 2: IdException.pas öffnen
  • Schritt 3: Den Code wie folgt erweitern:
    • Rot: Code muss neu hinzugefügt werden
    • Blau: Code muss überschriben werden. Der Ursprüngliche Code steht als Kommentar in Grün dahinter
    Code:
    unit IdException;

    interface

    uses
      SysUtils;

    [color=#FF0000]const
      IdErrorUnknown = 0;[/color]

    type
      [color=#FF0000]TErrorType = Integer;[/color]
      [color=#0000FF]EIdException = class(Exception)
        public
          constructor Create(const Msg: string);Overload; [/color][color=#00CA00]{EIdException = class(Exception);}[/color][color=#0000FF]
      end;[/color]
      [color=#FF0000]TOnError = procedure(fErrorType: TErrorType;fErrorMsg: String) of object;
      TIndyException = class
        private
          LOnError: TOnError;
        public
          LastErrorMsg: String;
          property OnError: TOnError read LOnError write LOnError;
      end;[/color]
      TClassIdException = class of EIdException;
      // You can add EIdSilentException to the list of ignored exceptions to reduce debugger "trapping"
      // of "normal" exceptions
      EIdSilentException = class(Exception)
        public
          constructor Create(const Msg: string);Overload; {EIdException = class(Exception);}
      end;

      ...

      {Icmp exceptions}
      EIdIcmpException = class(EIdException);

      EIdSetSizeExceeded = class(EIdException);

    [color=#FF0000]var vIndyException: TIndyException;[/color]

    implementation

    { EIdProtocolReplyError }

    [color=#FF0000]constructor EIdException.Create(const Msg: string);
    begin
      if Assigned(vIndyException) then if Assigned(vIndyException.OnError) then
      begin
        vIndyException.OnError(IdErrorUnknown,Msg);
        Abort;
        exit;
      end;
      raise Exception.Create(Msg);
    end;

    constructor EIdSilentException.Create(const Msg: string);
    begin
      // Nichts tun!
    end;[/color]

    ...
  • Schritt 4: So, das ganze compillieren.
  • Schritt 5: Nun wollen wir uns anschauen wie wir das ganze nun benutzen. Falls ihr die Exceptions wie gehabt wollten könnte ihr das hier einfach auslassen :
    • Schritt a) In der betreffenden Unit die Ueses mit IdException erweitern:
      Delphi-Quellcode:
      uses
        idException;
    • Schritt b) In das OnCreate-Ereignis kommt nun folgendes (Den Funtkionsnamen könnt ihr natürlich ändern; Lediglich die Variable vIndyException muss so bleiben):
      Delphi-Quellcode:
        vIndyException:=TIndyException.Create;
        vIndyException.OnError:=IndyError;
    • Schritt c) Nun brauchen wir natürlich noch die IndyError-Funktion. Hier ein Beispiel:
      Delphi-Quellcode:
      procedure TfMain.IndyError(fErrorType: TErrorType;fErrorMsg: String);
      begin
        MessageBox(Handle,PChar('In Indy ist folgender Fehler aufgetrteten: '+#10#13+fErrorMsg),'Indy-Fehler',MB_OK or MB_ICONSTOP);
      end;
    • Schritt d) Fertig. Nun könnt ihr mit dem Fehler gemütlich umgehen.
  • Schritt 6: Ok, ihr habt das jetzt installiert.

Ok, vielleicht fragt ihr euch jetzt, für was denn fErrorType in der Funktion IndyError ist. Im Moment gibt es da nur den Wert IdErrorUnknown, ich werde mich jedoch in nächster Zeit etwas ausführlicher damit beschäftigen und evtl. mehr Fehlercodes einbauen, und wenn wer von euch Lust drauf hat, kann er das auch gerne einbauen. Da man im EIdException - Event nicht mehr erkennen kann, warum der Fehler ausgelöst wird ist die einzige Möglichkeit, die Fehler anhand der Fehlermeldung auszuwerten. Die ganzen Meldungen stehen in der Unit IdResourceStrings, ich hab sie auch mal angehängt. Wenn wer von euch mir die Mühe abnehmen will (Hehe) darf er das gerne auswerten
In dne Anhängen ist auch noch ein kleines Beispiel von mir.

Ich hoffe, ich hab euch mit dem Tutorial weitergeholfen. Für Verbesserungsvorschläge und Fehler bin ich natürlich offen!

Gruß

Euer moritz

Anhänge:
  • Anhang 1: ZIP-Datei mit Beispiel (Executable & Source) und fertiger IdException.pas; Geschrieben in Delphi 7 Pro
  • Anhang 2: Datei IdResourceStrings.pas mit allen Fehlermeldungen

[edit=sakura] Wir tun alles Mfg, sakura[/edit]
[edit=flomei]Wir tun wirklich alles... - Text und Anhang aktualisiert - MfG, flomei[/edit]
Angehängte Dateien
Dateityp: pas idresourcestrings.pas (38,0 KB, 194x aufgerufen)
Dateityp: zip idexception_644.zip (267,4 KB, 190x aufgerufen)
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz