@ Давид: Я должен согласиться. Если я переключу порядок операторов в блоке 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, поэтому извиняюсь, если это кажется прямым вопросом / ответом.
Как должен быть правильно написан код для работы с утверждениями и правильного освобождения объектов, сбора ошибок и т. Д.?