Ludo Brands schrieb:

As an example consider the following routine:

Procedure Doit (Name : string);
Var F : Text;
begin
  Try
    Assign (F,Name);
    Rewrite (name);
    ... File handling ...
  Finally
    Close(F);
  end;

That's a questionable example. Which of the actions are required for proper operation of Close?

It's much clearer with objects:

  MyObj := TMyClass.Create;
  //only now the local variable has an valid value
  try
    //do something with MyObj
  finally
    MyObj.Free;
  end;

Wrong placement of the "try" can result in references to uninitialized local variables in the "finally" code, with unpredicatable effects.

That's why I prefer to initialize local object variables to Nil, before entering an try-finally block where they are created. This pattern allows to use an single try-finally block to protect multiple local objects:

  obj1 := nil;
  obj2 := nil;
  ...
  try
    obj1 := T1.Create;
    ...
  finally
    obj1.Free;
    obj2.Free;
    ...
  end;

DoDi


--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to