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