ほかのソフトの選択文字列を取得し、
コマンドラインに応じた加工をして終了するソフトを作っています。
フォームなどは一切必要ないので、
どうせならばとFormsをuses節からはずし、
beginからend.の間だけで処理を済ますようにしてます。
でも、そこでクラスを作成し、その中で例外を発生させると、
そのばでアプリケーションが強制終了してしまいます。
inherited Create;
if ParamCount <= 0 then
// サイレント例外を使って脱出
raise EAbort.Create('コマンドラインがありません');
↑でEAbortが生成された直後に強制終了します。
たぶんここで例外オブジェクトを使ってはいけないのだと思いますけど、
いつから例外オブジェクトを使ってよくなるのか、わかりません。
どうすれば例外オブジェクトを使ってよくなるんでしょうか?
そのクラスをCreateするときに例外はキャッチしていますか?
単純なテストでは引っかかってくれますけど。
ありがとうございます。
ええと、キャッチというのは、try...exceptのことでしょうか?
それなら、特にしていませんけど…。
これは、Createの中でオブジェクトを破棄するためにつけたんですけど、
キャッチする必要はあるのならば、except...endの間には何を書けばいいんでしょうか?
いえ、Createからraiseするときには、try文はいりません。
そのオブジェクトをCreateするときですよ。
つまり、
TCmdClass=class
public
constructor Create;
end;
implementation
constructor TCmdClass.Create;
begin
raise EAbort.Create('コマンドラインがありません');
end;
とあったとして(Createしたら必ず例外が発生するわけですが)、この作成に、
var
cmd: TCmdClass;
begin
// ここにプログラムコードを書いてください。
try
cmd := TCmdClass.Create;
cmd.Free;
except
;
end;
end;
こうしていますか?
TCmdClassは、Createしたときに例外を発生します。
そのため、Create文は、tryでくくらなければ、例外はさらに上へ流れていきます。
アプリケーション中、例外を取得していなければ、そのままOSへ例外が渡され、アプリケーションは終了します。
なるほど、考えてみたらそのとおりですね。
失礼しました(^_^;)
try
TCmdInfo.Create(CommandParam);
except
on EAbort do;
end;
としてみましたら、そうしたら普通に終了しました。
ありがとうございます。
ツイート | ![]() |