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