В качестве примера возьмем следующий код:
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;
Теперь, если я не делаю что-то действительно глупое, не должно быть никаких причин иметь один и тот же код дважды в блоке "Окончание" и после, а также в блоке "Исключение".
Обычно у меня иногда есть некоторые процедуры, которые могут быть похожи на первый пример, который я опубликовал, и если я получаю ошибку, курсор застревает как песочные часы. Добавление обработчиков исключений помогает, но кажется, что это грязный способ - по сути, игнорирование блока finally, не говоря уже об уродливом коде с копированием-вставкой из частей Окончание в исключение.
Я все еще очень много изучаю Delphi, поэтому извиняюсь, если это кажется прямым вопросом / ответом.
Как должен быть правильно написан код для работы с утверждениями, правильного освобождения объектов и сбора ошибок и т. Д.?