On 1/24/25 4:04 AM, Hairy Pixels via fpc-pascal wrote:
On Jan 24, 2025 at 8:38:25 AM, Nikolay Nikolov via fpc-pascal <fpc-pascal@lists.freepascal.org> wrote:
Maybe because there's a much better way to write it:

procedure foo();
var
  s1: TStringList = nil;
  s2: TStringList = nil;
  s3: TStringList = nil;
begin
  try
    s1:=TStringList.create;
    s2:=TStringList.create;
    s3:=TStringList.create;
    doWhatever(s1,s2,s3);
  finally
    FreeAndNil(s3);
    FreeAndNil(s2);
    FreeAndNil(s1);
  end;
end;

Best regards,

Nikolay

I’ve basically never used try..finally in  my own code but I have seen really ugly nested like about in other projects.
Then your code will probably cause memory leaks in case of exceptions, and even worse - leaks of other resources (file handles, sockets, etc.).
This a down stream consequence of exceptions right?

That's a downstream consequence having error handling with proper cleanup, regardless of whether the language uses exceptions, or not. Consider the case, without exceptions, as is typical for procedural APIs:

function foo: LongInt;

var

  s1, s2, s3: TStringList;

begin

  s1 := Create_StringList;

  if s1=nil then

  begin

    Result := error;

    exit;

  end;

  s2 := Create_StringList;

  if s2=nil then

  begin

    Free_StringList(s1);

    Result := error;

    exit;

  end;

  s3 := Create_StringList;

  if s3=nil then

  begin

    Free_StringList(s1);

    Free_StringList(s2);

    Result := error;

    exit;

  end;

  if not doWhatever(s1, s2, s3) then

  begin

    Free_StringList(s1);

    Free_StringList(s2);

    Free_StringList(s3);

    Result := error;

    exit;

  end;

  {...etc.}

  Free_StringList(s1);

  Free_StringList(s2);

  Free_StringList(s3);

end;

As you can see, it's more complicated and more error prone. You can simplify it a little bit with goto, but it will never be better, compared to try...finally

Best regards,

Nikolay
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to