@ Давид: Я должен согласиться. Если я переключу порядок операторов в блоке finally, Screen.Cursor не будет изменен обратно, если Obj.Free вызовет исключение. Это оставляет две попытки .. окончательно конструировать как единственно правильное решение, как уже сказал Андреас. Я обычно предполагаю, что назначения Screen.Cursor не могут быть неудачными, но это может быть просто ошибкой.

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

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, потому что перед тем, как добраться до этих строк, код был взломан?

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

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;

Теперь, если я не делаю что-то действительно глупое, не должно быть никаких причин иметь один и тот же код дважды в блоке «После» и после, а также в блоке «Исключение».

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

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

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

Ответы на вопрос(6)

Ваш ответ на вопрос