Ich sehe einfach nicht was der Vorteil von deinem FinallyExit sein soll. Was ist der Unterschied, ob ich schreibe
Delphi-Quellcode:
procedure Foobar;
begin
try
{…}
if foo=bar then
Exit;
{…}
finally
ShowMessage('foobar end')
end;
end;
oder
Delphi-Quellcode:
procedure Foobar;
begin
{…}
if foo=bar then
Exit;
{…}
FinallyExit:
ShowMessage('foobar end')
end;
?
Der einzige Unterschied, den ich sehe, ist, dass in letzterem Fall eine Zeile und eine Verschachtelung spare; aber dafür kommt ein zusätzliches, redundantes Sprachfeature hinzu.
Ich mag die Dinger nicht und halte sie für wesentlich überschätzt.
Wenn man sie konsequent nutzen will, müsste man quasi jeden Befehl in einen try-Block kapseln.
Delphi-Quellcode:
A:=TA.Create;
B:=TB.Create;
try
...
finally
A.Free;
B.Free;
end;
Was aber, wenn schon TA.Create fehl schlägt???
Also müsste man dutzende try-Blöcke ineinander schachteln, um wirklich sicher zu sein?
Ich halte das für Unsinn.
Dafür gibt es ein schönes Pattern:
Delphi-Quellcode:
A := nil;
B := nil;
try
A := TA.Create;
B := TB.Create;
finally
A.Free;
B.Free;
end;
Das Tolle an Free ist nämlich, dass erst geprüft wird, ob self nil ist:
Delphi-Quellcode:
procedure TObject.Free;
begin
if Assigned(self) then
Destroy;
end;
Abgesehen davon löst dein FinallyExit das von dir angesprochene Problem auch nicht.
Bezüglich deines Codebeispiels:
Wieso nicht einfach so?
Delphi-Quellcode:
function TFormTestFinallyExit.Test: String;
{…}
begin
Result := 'nix';
S := '';
I := 0;
Add('begin');
{…}
try
Add(' try');
{…}
if RadioGroupMode.ItemIndex = 6 then
begin
Add(RadioGroupMode.Items[RadioGroupMode.ItemIndex]);
Add(IntToStr(1 div I));
end;
Add(' ok');
finally
Add(' finally');
Add('end(finally)');
Result := S; // redundant
Add('end(normal)');
Result := S;
end;
end;
oder so:
Delphi-Quellcode:
function TFormTestFinallyExit.Test: String;
{…}
begin
try
Result := 'nix';
S := '';
I := 0;
Add('begin');
{…}
try
Add(' try');
{…}
if RadioGroupMode.ItemIndex = 6 then
begin
Add(RadioGroupMode.Items[RadioGroupMode.ItemIndex]);
Add(IntToStr(1 div I));
end;
Add(' ok');
finally
Add(' finally');
Add('end(finally)');
Result := S; // redundant
end;
finally
Add('end(normal)');
Result := S;
end;
end;