サンプルとして次のコードを取ります。
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ブロックとafter、およびExceptionブロックに同じコードを2回含める理由はないはずです。
基本的に、私が投稿した最初のサンプルに似た手順がある場合があります。エラーが発生した場合、カーソルは砂時計として動かなくなります。Exceptionハンドラーを追加すると役立ちますが、それを行うには汚い方法のようです。FinallyからExceptionの部分にコピーアンドペーストする醜いコードは言うまでもなく、基本的にFinallyブロックを無視します。
私はまだDelphiを非常に学んでいるので、これが簡単な質問/回答であると思われる場合はお詫びします。
ステートメントを処理し、オブジェクトを正しく解放し、エラーなどをキャプチャするために、コードをどのように正しく記述する必要がありますか?