Announcement

Collapse
No announcement yet.

JEGLICHE Exception einer Application erkennen !

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • JEGLICHE Exception einer Application erkennen !

    Hallo !

    Ich habe ein Problem und vielleicht weiß irgend jemand die Lösung dazu (ich hoffe sehr stark auf Hr. Kosch !)
    Und zwar sollte meine Anwendung erkennen, daß IRGENDEINE Exception auftritt und daraufhin ein mail an den dafür Verantwortlichen senden !
    Gibt es dafür (Erkennung jeglicher Exception) eine bereits implementierte Möglichkeit ?
    Es wäre sehr mühsam, jeden einzelnen Programmabschnitt manuell auf Fehler zu überprüfen und darauf zu reagieren !
    Eventuell kann TApplication ja selbst irgendwie erkennen, daß der Programmablauf gestoppt wurde und/oder es einen Absturz gab und bietet eine Möglichkeit darauf zu reagieren (sowas wie "BeforeException" wäre super)

    Vielen Dank für die Bemühungen !

    P.S. : Ich bin begeistert von diesem Forum !!!! Großes Lob an alle Beteiligten .... !!!!!

  • #2
    Hallo Bernd,

    rufe Dir mal die Hilfe zu TApplication.OnException auf. Hier kannst Du in deinem Projektfile für alle nicht abgefangenen
    Exceptions dh. für die, die bis zur Application hochgereicht werden einen Exception-Handler definieren. (siehe Beispiel).

    In diesem könntest Du dein Mailexit unterbringen.

    Hoffe das ist das was du meinst.

    Gruß Andr

    Comment


    • #3
      <b>Vielen Dank für die schnelle Hilfe Andre,</b>

      ich werd' mir "OnException" von "TApplication" noch genauer zu Gemüte führen (müssen) ....
      Hab's mir ja früher schon angesehen, offensichtlich hab' ich's aber etwas falsch verstanden gehabt ...

      Comment


      • #4
        Hallo,

        alternativ zu TApplication.OnException gibt es da auch noch die Aufruf-Direktive <b>SafeCall</b>. Obwohl Delphi SafeCall normalerweise nur bei COM-Objekten verwendet, bedeutet dies nicht, dass man diese speziell geschützte Form nicht auch in einem ganz normalen Nicht-COM-Programm verwenden kann:
        <pre>
        type
        TForm1 = class(TForm)
        StatusBar1: TStatusBar;
        Edit1: TEdit;
        ButtonConvert: TButton;
        procedure ButtonConvertClick(Sender: TObject);
        private
        procedure DoWork; safecall;
        public
        function SafeCallException(ExceptObject: TObject;
        ExceptAddr: Pointer): HResult; override;
        end;
        </pre>
        Im Initialization-Abschnitt der Unit wird die eigene <b>SafeCallError</b>-Implementierung der von Delphi vordefinierten globalen Prozedurvariable zugewiesen. Somit ruft Delphi bei jeder ausgelösten Exception die eigene Implementierung auf:
        <pre>
        initialization
        SafeCallErrorProc := @SafeCallError;
        finalization
        SafeCallErrorProc := nil;
        </pre>
        Und in <b>SafeCallException</b> legt das Programm fest, welche Exception der Anwender zu Gesicht bekommen soll und welche nicht. Aber alle Exceptions werden im folgenden Beispiel in einer Textdatei mitprotokolliert:
        <pre>
        function TForm1.SafeCallException(ExceptObject: TObject;
        ExceptAddr: Pointer): HResult;
        var
        Handled: Boolean;
        begin
        Result := E_UNEXPECTED;
        Handled := False;
        // spezielle Exception auswerten und als behandelt kennzeichnen
        if ExceptObject is EConvertError then
        begin
        Handled := True;
        ShowMessage('Die Umwandlung dieses Wertes ist nicht möglich');
        end;
        // Exception im Log mitprotokollieren
        LogError(Exception(ExceptObject), ExceptAddr);
        if Handled then
        gPrivateExceptionClass := nil
        else
        begin
        gPrivateExceptionClass := ExceptClass(ExceptObject.ClassType);
        gPrivateExceptionMsg := Exception(ExceptObject).Message
        end
        end;
        </pre>
        Kann <b>SafeCallExeption</B> eine Exception konkret zuordnen und soll diese Exception nicht angezeigt werden, setzt der Handler die globale Variable gPrivateExceptionClass auf den Wert Nil. In diesem Fall löst SafeCallError nur noch eine stille Exception aus, indem Abort aus der Unit SysUtils aufgerufen wird:
        <pre>
        Var
        gPrivateExceptionClass : ExceptClass = nil;
        gPrivateExceptionMsg : String;

        procedure SafeCallError(ErrorCode: Integer; ErrorAddr: Pointer);
        begin
        if gPrivateExceptionClass <> nil then
        raise gPrivateExceptionClass.Create(gPrivateExceptionMsg )
        else
        SysUtils.Abort
        end;
        </pre>
        Die globale Prozedur <b>LogError</b> speichert die wichtigsten verfügbaren Informationen von jeder aufgetretenen Exception in einer ASCII-Datei.
        <pre>
        procedure LogError(ExceptObject: Exception; ExceptAddr: Pointer);
        var
        Log: TextFile;
        const
        LogName = 'C:\Temp\SafeCallLog.txt';
        begin
        AssignFile(Log, LogName);
        if FileExists(LogName) then
        Append(Log)
        else
        Rewrite(Log);
        try
        WriteLn(Log, Format('%s'#9'%s'#9'$%p'#9'%s',
        [ExceptObject.ClassName, ExceptObject.Message,
        ExceptAddr, Application.ExeName]))
        finally
        CloseFile(Log)
        end;
        end;
        </pre>
        Das ist - wie gesagt - nur eine andere Option, falls OnException aus irgendeinem Grund nicht verwendet werden soll

        Comment


        • #5
          Vielen herzlichen Dank auch an Sie Hr. Kosch !

          Die Alternative der Exception-Behandlung mit <b>SafeCall</b>, wie Sie es vorschlagen, ist für mich auf jeden Fall sehr lehrreich und kann unter Umständen auch sehr hilfreich für mich sein, falls es sich in weiterer Folge doch herausstellen sollte, daß "OnException" für den speziellen Fall nicht unbedingt verwendet werden soll oder kann !

          Auf alle Fälle habe ich wieder einiges dazugelernt und meine Begeisterung für das Delphi-Entwickler-Forum ist auch wieder gewachsen !
          In diesem Sinne nochmals vielen Dank und ich freue mich schon auf viele weitere Problemlösungen, Anregungen und Ideen im Forum

          Comment

          Working...
          X