Hallo,
leider ist mir kein besserer Threadtitel eingefallen.
In letzter Zeit bin ich beim Programmieren immer wieder auf Konstrukte gestoßen, bei denen ich mir unsicher bin, wie ich sie in sauberen Quellcode presse. Natürlich habe ich mir dazu Gedanken gemacht und werde diese hier darstellen. Ich bitte euch, meine Gedanken zu kommentieren und mir ggf. einen besseren Weg vorzuschlagen.
Ich verwende in meinen Beispielen hier aufgrund meines aktuellen Projektes .Net-Code. Die Probleme lassen sich aber ebenso in
Win32-Code darstellen.
Fall 1:
Ich führe eine Prozedur aus, die auf verschiedene Werte aus einer Ini-Datei angewiesen ist. Fehlt einer der Werte, kann die Aufgabe nicht erfüllt werden. Es soll dann eine Fehlermeldung ausgegeben und die Verarbeitung abgebrochen werden. Prinzipiell läßt sich dieses Problem auf jeden Programmteil verallgemeinern, der linear abgearbeitet und im Fehlerfall unterbrochen werden soll.
Lösungsidee:
Einlesen aller Werte nacheinander. Falls ein Wert fehlt -> Ausgabe einer Meldung und Prozedurabbruch per
exit
Beispiel:
Delphi-Quellcode:
If not ReportDoc.GetLogOnData(ReportDoc.GetIniValue('AutoDB'), loServer,
loDB, loUser, loPass) then
begin
MessageBox.Show('Es konnten keine Logindaten für die Datenbank ' +
'gefunden werden.' + #13#10 + 'Ini-Datei, Key: AutoDB',
'Fehler', MessageboxButtons.OK, MessageBoxIcon.Error);
exit
end;
If Directory.Exists(OutputPath) then
begin
MessageBox.Show('Das Ausgabeverzeichnis existiert bereits.',
'Fehler', MessageboxButtons.OK, MessageBoxIcon.Error);
exit
end
else
try
Directory.CreateDirectory(OutputPath)
except
MessageBox.Show('Fehler beim Erstellen des Ausgabeverzeichnisses.' +
Environment.NewLine + '(' + OutputPath + ')',
'Fehler', MessageboxButtons.OK, MessageBoxIcon.Error);
exit
end;
Kann man das so machen?
Ein Problem fällt mir dabei sofort auf. Diesen
handle ich mir durch das
exit ein. Falls ich vor diesem Abschnitt z.B. einen Button deaktiviere und danach wieder aktivieren will, wird dies im Fehlerfall nicht ausgeführt, da die Prozedur einfach abgebrochen wird.
Fall 2:
Es ist ja hinlänglich bekannt, dass man zum Ressourcenschutz
try..finally..end-Blöcke verwendet. Was mache ich aber, wenn ich gleich mehrere Objekte zur Laufzeit erstellen muß? Es kann ja prinzipiell überall ein Fehler auftreten. Das einzige, was mir einfällt, wäre ein Schachteln der Blöcke.
Hier ein Beispiel:
Delphi-Quellcode:
SqlConn := SqlConnection.Create;
try
SqlConn.ConnectionString := 'Application Name=' + self.Text + ';' +
'Persist Security Info=True;' +
'Data Source=' + loServer + ';' +
'Initial Catalog=' + loDB + ';' +
'User Id=' + loUser + ';' +
'Password=' + loPass + ';';
SqlComm := SqlCommand.Create(SqlAbfrage, SqlConn);
try
LogLines := StringCollection.Create;
try
try
SqlConn.Open;
except
MessageBox.Show('Fehler bei der Anmeldung an der Datenbank.', 'Fehler',
MessageboxButtons.OK, MessageBoxIcon.Error);
exit
end;
try
SqlDR := SqlComm.ExecuteReader;
except
// Fehlermeldung ausgeben...
end;
try
// Daten hier verarbeiten
finally
SqlDR.Free
end;
finally
LogLines.Free
end;
finally
SQLComm.Free
end:;
finally
SQLConn.Free
end;
Also wenn das nich grausam aussieht... Geht sowas nicht hübscher?
Das waren jetzt erstmal die 2 Fälle, die mir besonders auf dem Herzen lagen. Ich hoffe, ihr könnt mir weiterhelfen, damit sich mein Programmierstil wieder ein Stück verbessern kann. Falls mir noch etwas einfällt, weiß ich ja, wo ich Hilfe bekomme.
Danke für eure Hilfe,
Stephan