ひきつづきすみません。
例外処理で以下の場合はどうなりますか?
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;
>以下のようにするとコンパイルでエラーが出ます。
(<< 処理 >>の部分をコメントアウトしたら)
提示されたコードでは、コンパイルでエラーが出ないみたいです。
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;
ありがとうございます。
コンパイルが通らないのは
on e : Exception do OutputDebugString('Except error');
Result := false;
です。
コンパイルが通らないので以下のようにすると
コンパイルできましたけどOKなんですか?
on e : Exception do OutputDebugString('Except error');
else OutputDebugString('Dummy');
Result := false;
もう一つお願いします。
テストしたいのですが、
Exception 以外の例外を発生させる
簡単なコードってありますか?
on e: Exception do ShowMessage('');
else ShowMessage(''); ←こちら側で処理できる例外
よろしくお願いします。
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 から派生させるようにすることをお勧めします。
ツイート | ![]() |