フォームなしアプリケーションで、Exceptionクラスを使うには?

解決


たかみちえ  URL  2003-02-01 22:22:30  No: 2768

ほかのソフトの選択文字列を取得し、
コマンドラインに応じた加工をして終了するソフトを作っています。

  フォームなどは一切必要ないので、
どうせならばとFormsをuses節からはずし、
beginからend.の間だけで処理を済ますようにしてます。

  でも、そこでクラスを作成し、その中で例外を発生させると、
そのばでアプリケーションが強制終了してしまいます。
  inherited Create;
  if ParamCount <= 0 then
    // サイレント例外を使って脱出
    raise EAbort.Create('コマンドラインがありません');
  ↑でEAbortが生成された直後に強制終了します。

  たぶんここで例外オブジェクトを使ってはいけないのだと思いますけど、
いつから例外オブジェクトを使ってよくなるのか、わかりません。
どうすれば例外オブジェクトを使ってよくなるんでしょうか?


にしの  2003-02-02 07:32:38  No: 2769

そのクラスをCreateするときに例外はキャッチしていますか?
単純なテストでは引っかかってくれますけど。


たかみちえ  URL  2003-02-02 08:58:26  No: 2770

ありがとうございます。

  ええと、キャッチというのは、try...exceptのことでしょうか?
それなら、特にしていませんけど…。

  これは、Createの中でオブジェクトを破棄するためにつけたんですけど、
キャッチする必要はあるのならば、except...endの間には何を書けばいいんでしょうか?


にしの  2003-02-02 09:18:10  No: 2771

いえ、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へ例外が渡され、アプリケーションは終了します。


たかみちえ  URL  2003-02-02 18:09:48  No: 2772

なるほど、考えてみたらそのとおりですね。
失礼しました(^_^;)

  try
    TCmdInfo.Create(CommandParam);
  except
    on EAbort do;
  end;
  としてみましたら、そうしたら普通に終了しました。
ありがとうございます。


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

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






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