AGB  ·  Datenschutz  ·  Impressum  







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

Exception richtig behandeln

Ein Thema von Jens Hartmann · begonnen am 4. Okt 2009 · letzter Beitrag vom 8. Jan 2010
Antwort Antwort
Seite 4 von 4   « Erste     234   
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#31

Re: Exception richtig behandeln

  Alt 8. Jan 2010, 15:49
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#32

Re: Exception richtig behandeln

  Alt 8. Jan 2010, 16:03
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;
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#33

Re: Exception richtig behandeln

  Alt 8. Jan 2010, 16:12
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#34

Re: Exception richtig behandeln

  Alt 8. Jan 2010, 16:27
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#35

Re: Exception richtig behandeln

  Alt 8. Jan 2010, 16:52
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
Delphi-Quellcode:
    on E: Exception do
      Writeln(E.Message);
  end;
  Readln;
end.
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#36

Re: Exception richtig behandeln

  Alt 8. Jan 2010, 16:57
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#37

Re: Exception richtig behandeln

  Alt 8. Jan 2010, 17:03
Sorry,

ich versteh eigendlich nur den Sinn von

Delphi-Quellcode:
  end;
  Readln;
end.
Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#38

Re: Exception richtig behandeln

  Alt 8. Jan 2010, 17:08
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 von Jens Hartmann:
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
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#39

Re: Exception richtig behandeln

  Alt 8. Jan 2010, 17:18
Danke Michael,

jetzt kann ich Arbeiten. Ich habe das jetzt verstanden.

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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#40

Re: Exception richtig behandeln

  Alt 8. Jan 2010, 17:23
Natürlich kannst du die eigenen Exception-Klassen jetzt noch mit eigenen Methoden ergänzen -- ganz nach deinem Bedürfnissen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


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 08:33 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