引き続き例外処理方法


なお  2009-10-29 09:48:04  No: 36009  IP: 192.*.*.*

ひきつづきすみません。
例外処理で以下の場合はどうなりますか?

try {
 << 処理 >>
 return(true)
} catch( Exception &e ) {
 ShowMessage(e.Message);
 return(false);
} catch(...) {
 ShowMessage('Error');
 return(false);
}

以下のようにするとコンパイルでエラーが出ます。

Try
 << 処理 >>
  Result := false;
Except
  On e: Exception do
    ShowMessage(e.Message);
  Else
    ShowMessage('Error');
  Result := false;
End;

編集 削除
igy  2009-10-29 12:57:30  No: 36010  IP: 192.*.*.*

>以下のようにするとコンパイルでエラーが出ます。

(<< 処理 >>の部分をコメントアウトしたら)
提示されたコードでは、コンパイルでエラーが出ないみたいです。

編集 削除
ttt  2009-10-29 22:07:40  No: 36011  IP: 192.*.*.*

exceptとendの間には、基本的にonやelseで始まる例外ハンドラしか書けません。
通常の文が書けるのは、例外ハンドラが一つもない場合だけです。
Result:=false を全部のケースでやりたいなら、一つ一つ全部に書かなくちゃだめですね。
例外ハンドラはステートメントを一つしかとらないので、複数の文を書くにはbeginとendで囲むのを忘れずに。

Try
  ……
Except
  On e: Exception do
  begin
    ShowMessage(e.Message);
    Result := false;
  end;

  Else
  begin
    ShowMessage('Error');
    Result := false;
  end;
End;

編集 削除
なお  2009-10-30 09:39:13  No: 36012  IP: 192.*.*.*

ありがとうございます。

コンパイルが通らないのは
  on e : Exception do OutputDebugString('Except error');
  Result := false;
です。
コンパイルが通らないので以下のようにすると
コンパイルできましたけどOKなんですか?
on e : Exception do OutputDebugString('Except error');
else                OutputDebugString('Dummy');
Result := false;

編集 削除
なお  2009-10-30 09:52:00  No: 36013  IP: 192.*.*.*

もう一つお願いします。

テストしたいのですが、
Exception 以外の例外を発生させる
簡単なコードってありますか?

on e: Exception do ShowMessage('');
else               ShowMessage('');    ←こちら側で処理できる例外

よろしくお願いします。

編集 削除
ttt  2009-10-30 14:51:44  No: 36014  IP: 192.*.*.*

Delphi 7のヘルプでexceptの文法を確認すると次のようになっています。

> exceptionBlockには次のいずれかを指定します。
> ・一連の別の文または
> ・一連の例外ハンドラ,オプションで後に次の文が続く
>    else statements

「statement」ではなく「statements」なので、elseの後には複数の文が書けることがわかります。
一方例外ハンドラの方は次の通りですから、文が一つしか書けません。
> on identifier:type do statement
1つ目がエラーで2つ目がエラーにならないのはそういう理由です。

> コンパイルできましたけどOKなんですか?
そのコードだとResult:=falseはelseでしか実行されませんから、
最初のC++のコードと等価ではありません。それで構わないというのならOKでしょう。

> Exception 以外の例外を発生させる簡単なコードってありますか?
ヘルプの「例外型の宣言」には以下のようにあるので、お勧めではないけれど
TObjectから適当なクラスを継承してRaiseすることはできそうですね。
> 例外型は,ほかのクラスとまったく同じように宣言します。
> 実際には,どのようなクラスのインスタンスでも例外オブジェクトとして使用できますが,
> 例外はSysUtils で定義されているException から派生させるようにすることをお勧めします。

編集 削除