Re: Fwd: What to do to get new users

Nikolay Nikolov via fpc-pascal <[email protected]>
Newsgroups gmane.comp.compilers.free-pascal.general
Message-ID <[email protected]>
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 
> <[email protected]> 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  -  [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.