Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Exception richtig behandeln (https://www.delphipraxis.net/141185-exception-richtig-behandeln.html)

Luckie 8. Jan 2010 14:49

Re: Exception richtig behandeln
 
Zerleg deine Methode HTMLErzeugenMBSerie in mehrere einzelne. Schon die try-except-Blöcke zeigen, dass dies besser wäre. Dann kommst du auch mit den try-except-Blöcken nicht durcheinander.

Jens Hartmann 8. Jan 2010 15:03

Re: Exception richtig behandeln
 
Zitat:

Zitat von Luckie
Zerleg deine Methode HTMLErzeugenMBSerie in mehrere einzelne. Schon die try-except-Blöcke zeigen, dass dies besser wäre. Dann kommst du auch mit den try-except-Blöcken nicht durcheinander.

Aber was soll ich da noch zerlegen. Eigendlich habe ich die doch schon komplett Zerlegt.
Der Aufbau ist ja folgendermaßen..

Delphi-Quellcode:
Button.Click;
  //HTMLErzeugen wird aufgerufen

  //HTMLErzeugen erstellt die Datei aus einer Datenbank
 
  //und ruft anschließend die Funktionen

  //Drucken

  //Speichern

  //Senden

  //Öffnen

  //hintereinander auf.
Hinter diesen einzelnen Funktionen, zumindstend hinter Save und EMail sind ja schon Funktionen hinter verborgen. und Öffnen und Drucken sind ja nur ShellExecute Anweisungen.



Delphi-Quellcode:
{HTML-Datei für MB-Serie erstellen} 
procedure THTMLExportForm.HTMLErzeugenMBSerie;
Var
  slHTML : TStringList;
  i : integer;
  mrResult: Integer;
  FileName : String;
begin
  try
    try
      slHTML := TStringList.Create;

      slHTML.Add('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"');
      slHTML.Add('<html>');

      slHTML.Add('<head>');
      slHTML.Add('<link rel="stylesheet" type="text/css" href="MB.css"');
      slHTML.Add('<Style type="text/css"></style>');
      slHTML.Add('<title>Protokolldatei</title>');
      slHTML.Add('</head>');

      slHTML.Add('<body>');
      slHTML.Add('<img src= ".\Kopf1.bmp" width= "900" height= "150" align= "rigth" alt= "Titel" >');
      slHTML.Add('<h1 style="color:#FFFFFF; background-color:#000080; align= "right">Firma hartmann & uebach Nachrichtentechnik GmbH</h1>');
      slHTML.Add('<h1 style="color:#000080;">Objekt: '
                 +QryVorgabe.FieldByName('KUNDEOBJEKT').AsString+'</h1>');
      slHTML.Add('<table border="0" style="border-collapse:separate;"'+ 
                 'width="100%" style="'+ 
                 'border-left:5px solid #000080;border-right:5px solid #000080;'+ 
                 'border-top:5px solid #000080;border-bottom:5px solid #000080;>');
      slHTML.Add('<tr>');
      slHTML.Add('<th align="left">Protokolldatei vom '+DateTimeToStr(Now)+'</th>');
      slHTML.Add('<th align="left">ID</th>');
      slHTML.Add('<th align="left">LfdNr</th>');
      slHTML.Add('<th align="left">Datum</th>');
      slHTML.Add('<th align="left">Uhrzeit</th>');
      slHTML.Add('<th align="left">Ereignis</th>');
      slHTML.Add('<th align="left">Teilnehmer</th>');
      slHTML.Add('<th align="left">Bereich</th>');
      slHTML.Add('<tr>');
      for i := 0 to QryHTML.RecordCount -1 do
        begin
          slHTML.Add('<tr class="' + QryHTML.FieldByName('Ereignis').AsString + '">');
          slHTML.Add('<td>');
          slHTML.Add(IntToStr(QryHTML.FieldByName('ID').AsInteger));
          slHTML.Add('</td>');
          slHTML.Add('<td>');
          slHTML.Add(IntToStr(QryHTML.FieldByName('LfdNr').AsInteger));
          slHTML.Add('</td>');
          slHTML.Add('<td>');
          slHTML.Add(DateToStr(QryHTML.FieldByName('Datum').AsDateTime));
          slHTML.Add('</td>');
          slHTML.Add('<td>');
          slHTML.Add(TimeToStr(QryHTML.FieldByName('Uhrzeit').AsDateTime));
          slHTML.Add('</td>');
          slHTML.Add('<td>');
          slHTML.Add(QryHTML.FieldByName('Ereignis').AsString);
          slHTML.Add('</td>');
          slHTML.Add('<td>');
          slHTML.Add(QryHTML.FieldByName('Teilnehmer').AsString);
          slHTML.Add('</td>');
          slHTML.Add('<td>');
          slHTML.Add(QryHTML.FieldByName('Bereich').AsString);
          slHTML.Add('</td>');
          slHTML.Add('</tr>');
          QryHTML.Next;
        end;
      slHTML.Add('</table>');
      slHTML.Add('</body>');
      slHTML.Add('</html>');
    except
      on e : Exception do begin
        TForm1.Servicememo.Lines.Add(e.Message);
      raise;
      end;
    end;

    try
      FileName := SaveHTML(slHTML);
    except
      on e : Exception do begin
        e.Message := 'Datei konnte nicht gespeichert werden'#13#10+e.Message;
      raise;
      end;
    end;

    try
      if AnzeigenCheckBox.Checked then
        ShellExecute(Application.Handle, 'open', PAnsiChar(FileName), nil, nil, SW_ShowNormal);
    except
      on e : Exception do begin
        e.Message := 'Datei konnte nicht geöffnet werden'#13#10+e.Message;
      raise;
      end;
    end;

    try
      if VersendenCheckBox.Checked then
        SendMail(FileName);
    except
      on e : Exception do begin
        e.Message := 'Datei konnte nicht als E-Mail versendet werden'#13#10+e.Message;
      raise;
      end;
    end;

    try
      if DruckenCheckBox.Checked then
        ShellExecute(handle, 'print', PAnsiChar(FileName), '', '', SW_HIDE);
    except
      on e : Exception do begin
        e.Message := 'Datei konnte nicht gedruckt werden'#13#10+e.Message;
      raise;
      end;
    end;

  finally
    slHTML.Free;
  end;
end;

Luckie 8. Jan 2010 15:12

Re: Exception richtig behandeln
 
So wie du das machst führst du die Strukturierteausnahmebehandlung ad absurdum. Normalerweise geht es so:
Delphi-Quellcode:
try
  Anweisung;
  Anweisung;
  Anweisung;
  Anweisung;
  Anweisung;
  Anweisung;
except
  Fehlerbehandlung;
end;
Lösung für dich: Deklarier dir eigene Exceptions, die in den Unterfunktionen geworfen werden:
ESaveError, ELoadError, ESendMailError, ...
Und dann:

Delphi-Quellcode:
try
  FileName := SaveHTML(slHTML);
  SendMail(FileName);
  ...;
except
  on E: ESaveError do
    ...;
  on E: EOpenError do
    ...;
end;
ShellExecute wirft übrigens keine Exceptions, da es eine Windows API-Funktion ist. ShellExecute liefert einen Fehlercode zurück.

Luckie 8. Jan 2010 15:27

Re: Exception richtig behandeln
 
Code-Beispiel:
Delphi-Quellcode:
program Project3;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  EDoSomething = class(Exception)

  end;

  EDoSomeMore = class(Exception)

  end;

procedure DoSomething;
begin
  raise EDoSomething.Create('Fehler in DoSomething');
end;

procedure DoSomeMore;
begin
  raise EDoSomeMore.Create('Fehler in DoSomeMore');
end;

begin
  try
    DoSomething;
    DoSomeMore;
  except
    on E: EDoSomething do
      Writeln(E.Message);
    on E: EDoSomeMore do
      Writeln(E.Message);
        // alle anderen Exceptions
    on E: Exception do
      Writeln(E.Message);
  end;
  Readln;
end.

Jens Hartmann 8. Jan 2010 15:52

Re: Exception richtig behandeln
 
Hallo Michael,

das mit den einzelnen Exception Behandlungen habe ich verstanden. Gute Sache, da wäre ich nie darauf gekommen das so zu machen. Vorallem kann ich ja auch so die einzelnen Behandlungen eventuell noch in USER-Verständliche Sprache in denn jeweiligen Exception übersetzen.

Allerdings, verstehe ich eine Sache nicht so ganz.

Was machen die letzten Zeilen :gruebel:
Delphi-Quellcode:
    on E: Exception do
      Writeln(E.Message);
  end;
  Readln;
end.
Zitat:

Zitat von Luckie
ShellExecute wirft übrigens keine Exceptions, da es eine Windows API-Funktion ist. ShellExecute liefert einen Fehlercode zurück.

Und wie werden solche Sachen behandelt. Macht das die Windows API schon allein.

Ansonsten danke, coole Idee. Werde das nach dem umsetzen aufjedenfall nochmal hier einstellen.

Gruß Jens

Luckie 8. Jan 2010 15:57

Re: Exception richtig behandeln
 
Steh doch im Kommentar: Sie fängt alle anderen Exceptions ab, die auftreten können. Können keine auftreten, kann das weggelassen werden.

Manche Exceptions musst du nicht neu definieren. Du kannst auch welche nehmen, die schon definiert sind un der SysUtils.pas.

Mit meiner Lösung wirst du die ganzen Exception Blöcke los und die Exceptions werden da geworfen, wo sie auch auftreten.

Jens Hartmann 8. Jan 2010 16:03

Re: Exception richtig behandeln
 
Sorry,

ich versteh eigendlich nur den Sinn von

Delphi-Quellcode:
  end;
  Readln;
end.
Gruß Jens

Luckie 8. Jan 2010 16:08

Re: Exception richtig behandeln
 
Ach so. Das Readln wartet auf eine Eingabe. Dann geht die Konsole nicht gleich zu, wenn man das Programm aus dem Explorer startet. Ist nur da, damit man noch die Ausgabe sieht.


Zitat:

Zitat von Jens Hartmann
Zitat:

Zitat von Luckie
ShellExecute wirft übrigens keine Exceptions, da es eine Windows API-Funktion ist. ShellExecute liefert einen Fehlercode zurück.

Und wie werden solche Sachen behandelt. Macht das die Windows API schon allein.

Den Rückgabewert abfragen. Ich würde das auch in eine Methode kapseln, den Rückgabewert mit if-Abfragen und im Fehlerfall eine Exception werfen mit dem entsprechen Fehlertext: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

Jens Hartmann 8. Jan 2010 16:18

Re: Exception richtig behandeln
 
Danke Michael, :thumb:

jetzt kann ich Arbeiten. Ich habe das jetzt verstanden. :idea:

Zitat:

Zitat von Luckie
Dann geht die Konsole nicht gleich zu

Sorry, hatte nicht gesehen, das es eine Konsolen Anwendung war. Sonst wäre mir das klar gewesen.

Gruß Jens

Luckie 8. Jan 2010 16:23

Re: Exception richtig behandeln
 
Natürlich kannst du die eigenen Exception-Klassen jetzt noch mit eigenen Methoden ergänzen -- ganz nach deinem Bedürfnissen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:45 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz