トップページ⇒tech
9コメント4KB

try except finallyが分かりません

■ このスレッドは過去ログ倉庫に格納されています
0001プログラマ NGNG
function Foo(): Boolean;
begin
 Result := False;

 リソース確保;
 try
  例外が発生する可能性のある処理;

  Result := True;
 finally
  リソース解放;
 end;
end;

これで、例外が発生してエラーになればFalse、
何も無ければTrueを返す関数を作ろうと思ったのですが
(例外が発生しても何事もなく、Falseを返す)
例外が発生した時、ちゃんと処理されません。ヘルプを
見ると、finallyは例外処理までやらない、みたいなことが
書いてありました。
どうすればいいでしょうか?
0002名無しさん@お腹いっぱい。 NGNG
下位層(Win32API)では、エラー状況を戻り値で把握しなければなりません。
それをラップするクラスやメソッドは、戻り値を例外クリエイトに変更してあげましょう。
そうすれば、大人数で開発するときに、戻り値を見ない人が居ても、
バグ位置で処理を停止することが出来ます。
00032 NGNG
そうしなければ、全呼び出しにif判定を付けなければならず、ステップが増えます。
00042 NGNG
それでも、どうしてもやると言うならば、

function Foo(): Boolean;
begin
 リソース確保;
 try try
  例外が発生する可能性のある処理;

  Result := True;
 Except
  Result := False;
 end;
 finally
  リソース解放;
 end;
end;
0005名無しさん@お腹いっぱい。 NGNG
エラーをcatchしてその中でfalseにすればいいじゃん。
00062 NGNG
エラーメッセージを出すなら、

function Foo(): Boolean;
begin
 リソース確保;
 try try
  例外が発生する可能性のある処理;

  Result := True;
 Except
  On E:Exception do begin
   Result := False;
   ShowMessage(E.Message);
  end;
 end;
 finally
  リソース解放;
 end;
end;
00072 NGNG
エラー処理をやって、さらに例外をそのまま上にあげる場合、

Procedure Foo(): Boolean;
begin
 リソース確保;
 try try
  例外が発生する可能性のある処理;
  if Win32Error then
   Raise Exception.create('Win32がエラーを起こしました');
 Except
  エラー処理;
  Raise; //例外をそのまま上にあげる
 end;
 finally
  リソース解放;
 end;
end;
00081 NGNG
皆さん素早いレスどうもありがとうございました。

上手くいったのですが、別の問題が出てしまいました。
この関数をForm.Createハンドラで呼び出して、False
なら、直ちにプログラムを終了させるつもりだったのですが

Releaseメソッドは、ハンドラから抜け出すまで実行
されないと書いてありました。

Form1.Create
 if not Foo then
  Release;

 正常時の処理;
end;

調べてみると、プログラムの終了方法にいくつかある
みたいなのですが、どれを使うのがいいのかわかりません。
条件文を反転して

 if Foo then
 begin
 正常時の処理;
 end
 else
  Release;
 end;

 //ここからイベントハンドラの終わりまで何も処理を書かない
end;

みたいにしないとダメなんでしょうか?
00091 NGNG
>8への、自己レスです。

起動時に条件分岐してプログラムを終了させるか実行させるか
というのは話題としてありきたりのようで、某メーリングリストで
検索したら、そのものズバリの質問と回答がありました。
お手数をかけました。
■ このスレッドは過去ログ倉庫に格納されています