[fpc-pascal] Fwd: What to do to get new users

Nikolay Nikolov nickysn at gmail.com
Fri Jan 24 07:34:26 CET 2025


On 1/24/25 8:12 AM, Hairy Pixels via fpc-pascal wrote:
> On Jan 24, 2025 at 12:43:51 PM, Nikolay Nikolov via fpc-pascal 
> <fpc-pascal at lists.freepascal.org> wrote:
>> That's not what exceptions are meant to be used for, though. What you 
>> describe is called a program "defect". When you encounter a "defect" 
>> in your program, you terminate the program. The proper handling of a 
>> defect is to fix (modify) the program, so it doesn't happen again. In 
>> the case of a "defect", there's no much point in freeing the memory, 
>> because all of the program's memory is freed anyway, when the process 
>> terminates. An exception is used for reporting an unanticipated 
>> condition, encountered at runtime. A program can be correct (bug 
>> free) and still encounter exceptions. For example, a web browser 
>> might encounter a network error, during the loading of a web page, in 
>> which case, it should report the error to the user in its GUI, and it 
>> should continue operating normally, instead of crashing, so the user 
>> can continue browsing, by e.g. trying again, or typing in a different 
>> URL, or switching to a different tab, etc.
>
> Yes I know I’m just saying that’s the most I’ve done with them in 
> Pascal. I do use them to escape deep recursion too and then they’re 
> very helpful but I would have random allocations in a recursive that 
> could fail randomly at any point.
>
>> Feels to me like manual memory management and exceptions don’t mix well.
>> I fail to understand how you came to this conclusion, since I just 
>> showed how the same code would look without exceptions, and it's way 
>> worse.
>>
>
> That example was the best scenario for exceptions where they’re 
> handled in the same scope they occur and they don’t bubble up through 
> the call stack.
Doesn't matter whether they're handled in the same scope or not. It's 
the same code. Usually they're not handled in the same scope, but in a 
very distant place. That's usually when exceptions are convenient.
> Once you let them bubble up you need to wrap all call sites with 
> try..finally right?

Wrong. Only sites that allocate memory, that needs to be freed, before 
leaving the scope need a try..finally. You don't need to wrap every 
call. That's nonsense. The pattern is:

var

   {... initialize local vars you're going to allocate in this function 
with nil}

begin

   try

     {lots of code, allocations, calls, etc}

   finally

     {cleanup code}

     {free stuff that isn't nil}

   end;

end;


Nikolay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20250124/9c0f90d9/attachment.htm>


More information about the fpc-pascal mailing list