![]() |
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.
|
Re: Exception richtig behandeln
Zitat:
Der Aufbau ist ja folgendermaßen..
Delphi-Quellcode:
Hinter diesen einzelnen Funktionen, zumindstend hinter Save und EMail sind ja schon Funktionen hinter verborgen. und Öffnen und Drucken sind ja nur ShellExecute Anweisungen.
Button.Click;
//HTMLErzeugen wird aufgerufen //HTMLErzeugen erstellt die Datei aus einer Datenbank //und ruft anschließend die Funktionen //Speichern //Senden //Öffnen //hintereinander auf.
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; |
Re: Exception richtig behandeln
So wie du das machst führst du die Strukturierteausnahmebehandlung ad absurdum. Normalerweise geht es so:
Delphi-Quellcode:
Lösung für dich: Deklarier dir eigene Exceptions, die in den Unterfunktionen geworfen werden:
try
Anweisung; Anweisung; Anweisung; Anweisung; Anweisung; Anweisung; except Fehlerbehandlung; end; ESaveError, ELoadError, ESendMailError, ... Und dann:
Delphi-Quellcode:
ShellExecute wirft übrigens keine Exceptions, da es eine Windows API-Funktion ist. ShellExecute liefert einen Fehlercode zurück.
try
FileName := SaveHTML(slHTML); SendMail(FileName); ...; except on E: ESaveError do ...; on E: EOpenError do ...; end; |
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. |
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:
Ansonsten danke, coole Idee. Werde das nach dem umsetzen aufjedenfall nochmal hier einstellen. Gruß Jens |
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. |
Re: Exception richtig behandeln
Sorry,
ich versteh eigendlich nur den Sinn von
Delphi-Quellcode:
Gruß Jens
end;
Readln; end. |
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:
![]() |
Re: Exception richtig behandeln
Danke Michael, :thumb:
jetzt kann ich Arbeiten. Ich habe das jetzt verstanden. :idea: Zitat:
Gruß Jens |
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. |
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