Suppose I have the following routine:
function ReadFile(f : TFilename) : Boolean;
var
  fs : TFileStream;
begin
  Result := False;
  try
    fs := TFileStream.Create(f, ...);
    try
      // read file ...
      Result := True;
    finally
      FreeAndNil(fs);
    end;
  except
    // handle exceptions ...
  end;
end;
What are the implications of having the except and finally transposed?  I have seen plenty of posts with them both ways around, but I haven't seen a clear explanation of which is appropriate in which cases (I still think it is curious that in the above construct, the finally block executes after the except block!).
I have also seen posts that suggest that mixing try..except and try..finally blocks is not a good idea.  How can you avoid it in situations where a routine throws an exception as part of normal operation - such as in some of the Indy routines?
 
     
    