finally内のStep実行?

解決


サトウ  2014-02-08 03:01:55  No: 46014

こんにちは。  又又、ご教授お願います。

環境は、WinXp Pro Sp3, Delphi XE3 Update2です。

以下の、処理でStep実行をすると、
Edit1.Clear; → Edit1.Text:='pass1'; → exit; → eEdit1.Text:='pass3'; → Edit2.Text='pass4';
の各文ごとに停止しながら進むと思うのだが、
Finally後の文で停止せず、すぐにTForm1.Button1Clickを抜け出てしまいます。
画面の表示上は、Edit1はpass3に,Edit2はpass4に値が設定されています。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Clear;
  try
    Edit1.Text := 'pass1';
    exit;
    Edit1.Text := 'pass2';
  finally
    Edit1.Text := 'pass3';
    Edit2.Text   := 'pass4';
  end;
end;

ところが、途中のexit文がないとfinallyの各文でもStep実行がされます。

procedure proc1();
begin
  sl := TStringList.Create;
  try
    何かの処理でEexitを実行
  finally
    FreeAndNil(sl);
  end;
end;
としStep実行したときに、FreeAndNilで止まらず抜けてしまうので、
なんとなくStringListが廃棄されないよう思えてしょうがないです。

また、
function Func1(): boolean;
begin
  try
    何かの処理を実行
  finally
    result := foo;
  end;
end;
とfinallyでresultを設定したとき、文法上finallyは必ず実行されるはずですが
コンパイルすると'戻り値が設定されていない可能性があります'の警告が表示されます。

結果的には、正しく処理されているので問題がないと思いますが、なにか気持ちが悪いです。

私の理解が間違っているのでしょうか?。
それともDelphiとしては、これでいいのでしょうか?
お分かりの方は是非教えてください。お願いいたします。


D  2014-02-09 07:06:49  No: 46015

>としStep実行したときに、FreeAndNilで止まらず抜けてしまうので、
>なんとなくStringListが廃棄されないよう思えてしょうがないです。

  FreeAndNil(sl);のところにブレークポイントを置いてステップ実行すればちゃんとそこで止まると思います。
またステップ実行でなくトレース実行を行えば止まると思います。
XE2スターターで確認。

ちなみにD6のプロでやってみたらトレース実行でも止まらずに抜けてしまいました。


サトウ  2014-02-10 01:16:07  No: 46016

Dさん  こんにちは
当地は、今朝積雪30cmで午前中は雪の片付けでした。

Dさんに確認していただいた点はこちらでも確認しました。

確かにトレース実行で止まりますが、途中にProcedure呼び出しがあると、そのProcedureに飛んでしっまて面倒なので、とりあえずFinallyにブレークポイントを設定するしかないですね。

Programing上は問題ないですが、しっくりしませんね。
そのような仕様になっているかどうかは不明ですが、製品がそのようにできているならしょうがないんでしょうね!!!!


ありい  2014-02-12 21:59:19  No: 46017

サトウさん、こんにちは。

(1)Button1Click について

  exit;にブレークポイントを立てて、その後に「トレース実行(F7)」でfinallyの直後に来ませんか?  こちらはD7,XE2で確認しました。

#私の環境では、どちらもfinally直後にブレークポイント立てて普通に止まるので何か違うのかもしれませんが...

(2)Func1 について

  こちらは再現できませんでした。警告は出ません。同じくD7,XE2です。

  tryの前に、exitを含む処理が入っているって事ではないですか?  コンパイル可能なコードを乗せた方が、有意義なコメントが付くのではと思います。

  以上、ご参考まで。


サトウ  2014-02-14 06:41:00  No: 46018

ありいさん  確認していただきましてありがとうございます。

(1)に関しては、ありいさんに確認していただいた結果と同様の結果を確認しました。

finally内にブレークポイントない場合
  Step実行なら    finallyでは止まらない
  Trace実行なら    finally内の最初の文で止まる
finally内にブレークポイントがある場合
  Step実行なら    finally内のブレークポイントで止まる
  Trace実行なら    finally内の最初の文で止まる

ということでした。ですのでStep実行ではProcedure内でもあってもfinnalyは別Procedureとして管理されていると考えればいいのかと思われます。今後、Step実行でDebugするときは、fially直後にもブレークポイントを設けるということでやっていきたいと思います。

(2)については、元のソースを修正してしまったので、あいりさんの指摘を確認することができませんでした。現ソースを見る限りあいりさんの指摘があっているかと思われます。申し訳ありませんでした。

ということで、解決とさせていただきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加