Einzelnen Beitrag anzeigen

Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#1

Fehlerbehandlung so richtig

  Alt 5. Mai 2011, 10:36
Hallo,
in die folgende (unübersichtliche) Funktion (mit Unterfunktionen) habe ich eine Fehlerbehandlung eingeführt. Ich weiß aber nicht, ob die funktioniert wie ich das denke (siehe Kommentare im Code), da bisher noch keine Fehler auftraten . Meint ihr das klappt so, hab versucht was hier in der DP in dem Tutorial zu Exceptions gesagt wurde umzusetzen und was in der Hilfe so stand?

Delphi-Quellcode:
function TLToA.CreateDateien(i: Integer): Boolean;
var q : TADOQuery;
/////////////////////////////
function SQL_Out : String;
var s : TSQL;
begin
  s:=TSQL.create;
  s.Add := 'Select Distinct exportline';
  s.Add := 'From ('+SQL_Main(i)+')';
  s.Add := 'Where gruppe = '+s.Ora_StrOfStr(q.FieldByName('gruppe').AsString);
  Result:=s.Text;
  s.Free;
end;
/////////////////////////////
procedure CreateGruppendatei;
var
  Z : TADOQuery;
  T : TStringlist;
  Dateiname : String;
begin
  T:=TStringList.Create;
  Dateiname:=q.FieldByName('datei').AsString;
  if Fileexists(Dateiname) then T.LoadFromFile(Dateiname);
  Z:=TADOQuery.Create(nil);
  Z.Connection:=aMain.Main.Projekt.DB.Con;
  Z.SQL.Text:=SQL_Out;
  try
    Z.Open;
    Z.First;
    while not Z.Eof do
      begin
      T.Add(Z.FieldByName('exportline').AsString);
      Z.Next;
      end;
    T.SaveToFile(Dateiname);
  except on e : Exception do
    begin
    // Innerer try-Block in Unterfunktion, soll reagieren auf Fehler
    // mit der Datenbank (Z.Open)und auf Fehler beim Speichern der TStringList (T.Save...)
    // Objekte der Unterfunktion sollen freigegeben werden
    T.Free; //Nötig? oder werden Freigaben 8 Zeilen tiefer trotzdem durchlaufen?
    Z.Free;
    // Dann soll der Fehler an die Hauptprozedur übergeben werden, weil da die
    // Meldung protokoliert werden soll.
    e.RaiseOuterException(e); //Exception weiterreichen?
    end;
  end;
  Z.Free; //Werden diese auch im Fehlerfall durchlaufen?
  T.Free;
end;
///////////////////////////
begin
  q := TADOQuery.Create(nil);
  q.Connection:=aMain.Main.Projekt.DB.Con;
  q.SQL.Add('Select');
  q.SQL.Add(' Distinct gruppe, datei');
  q.SQL.Add('From');
  q.SQL.Add(' ('+SQL_Main(i)+')');
  Result:=true;
  try
    q.Open;
    q.First;
    while not q.Eof do
      begin
      CreateGruppendatei;
      q.Next;
      end;
  except on e : Exception do
    begin
    // Hier sollen Fehler abgefangen werden, bei Problemen mit der DB (q.Open)
    // und die Fehler in evtl. aus der Unterfunktion hochgereicht werden
    // Z.Zt. ist das glaub ich so, dass die Schleife beendet wird (wg. dem q.free?)
    // wenn in der U-Funk ein Fehler passiert ist. Kann man das daher auch weglassen?
    // Würde dann der nächste Schleifendurchlauf gemacht oder ist die Schleife
    // nach einer Exception auf jeden Fall zu Ende?
    amain.Main.Projekt.MSG.Info('Fehler in Schritt '+IntToStr(i)).Text:=e.Message;
    Result:=false;
    q.Free;
    end;
  q.Free;
  end;
end;
Hoffe diese Form der Fragestellung ist OK, so.
Ralph
  Mit Zitat antworten Zitat