以以下代码为例:
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 仍将作为沙漏卡住,因为代码在到达这些行之前就被破坏了?
现在除非我弄错了,否则应该有一个异常语句来处理任何此类错误的发生,例如:
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 块,更不用说从 finally 复制粘贴到异常部分的丑陋代码了。
如果这似乎是一个直截了当的问题/答案,我仍然在学习 Delphi,所以很抱歉。
如何正确编写代码以处理语句并正确释放对象和捕获错误等?