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.