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