Как правильно писать операторы Try..Finally..Except?

В качестве примера возьмем следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
  Obj: TSomeObject;
begin
  Screen.Cursor:= crHourGlass;

  Obj:= TSomeObject.Create;
  try
    // do something
  finally
    Obj.Free;
  end;

  Screen.Cursor:= crDefault;
end;

если произошла ошибка в разделе // do something , созданный объект TSomeObject, я полагаю, не будет будет освобожден, и Screen.Cursor все равно застрянет как Hour Glass, потому что код был сломан до того, как добраться до этих строк?

Теперь, если я не ошибаюсь, должен существовать оператор Exception, чтобы иметь дело с любым таким возникновением ошибка, что-то вроде:

procedure TForm1.Button1Click(Sender: TObject);
var
  Obj: TSomeObject;
begin
  try
    Screen.Cursor:= crHourGlass;

    Obj:= TSomeObject.Create;
    try
      // do something
    finally
      Obj.Free;
    end;

    Screen.Cursor:= crDefault;
  except on E: Exception do
  begin
    Obj.Free;
    Screen.Cursor:= crDefault;
    ShowMessage('There was an error: ' + E.Message);
  end;
end;

Теперь, если я не делаю что-то действительно глупое, не должно быть причин, чтобы один и тот же код был дважды в блоке finally и после него, а также в блоке Exception.

Обычно у меня иногда есть процедуры, которые могут быть похожи на первый опубликованный мною образец, и если я получаю сообщение об ошибке, курсор застревает в виде песочных часов. Добавление обработчиков исключений помогает, но это кажется грязным способом сделать это - в основном игнорируется блок finally, не говоря уже об уродливом коде с копипастом из частей с окончанием в исключение.

Я все еще очень много изучаю Delphi, поэтому извиняюсь, если это кажется прямым вопросом / ответом.

Как должен быть правильно написан код, чтобы работать с операторами и правильно освобождать объекты и фиксировать ошибки и т. Д.?

26
задан menjaraz 15 March 2012 в 12:55
поделиться