0

コードの次の部分を検討してください。

Try
  arqTXT.LoadFromFile(LogPath);
finally
  ShowMessage(" The log file could not be found. Check if the service is running. ");
end;

私のメッセージの後に、次のようなシステム メッセージが表示されます。 ファイル "C:\log.txt" を開けません。このシステム メッセージを表示しない方法はありますか?

Delphi 2010 を使用しています

ありがとう。

4

3 に答える 3

5

その特定の例外をトラップし (EInOutError私の記憶が正しければ)、発生した他の例外をミュートしないようにしたいと考えています。したがって、他の例外が発生した場合 (たとえばEOutOfMemory、「飲み込まれ」ない場合)、一見動作しているように見えるが壊れたコードが残ります。

try
  ..
except
  on E: EInOutError do
        begin
          ..
        end;
end;

1 つのコンストラクトに多数の例外ハンドラーを含めることができます。未処理の例外は、try .. except ブロックの外部に伝播し続けます (エラー ボックスを表示するデフォルトの例外ハンドラなど)。

于 2012-08-17T17:51:35.720 に答える
1

指摘すべきことがいくつかあります。try..except他の回答/コメントで説明されているように、コードをブロックではなくブロック内にラップする必要がありますtry..finally。あなたのコード例がどのように機能するのか理解していません。なぜなら、現在書かれているように、例外があったかどうかにかかわらず、メッセージは常に表示されるからです。それはもっと似ているはずです...

try
  arqTXT.LoadFromFile(LogPath);
except
  on E: EInOutError do begin
    ShowMessage('The log file could not be found. Check if the service is running. Message: '
      + E.Message);
  end
end;

そのコードは、I/O例外をキャッチして処理します。さまざまなタイプの例外を処理する代わりに、別のタイプの例外を使用するか、すべてのタイプをキャッチEInOutErrorするために使用するのが汚い方法です。GetLastErroron E: Exceptionを使用して特定のエラーコードを識別し、このエラーコードをさらに認識/ログに記録して、I / O例外が発生したと想定して、何が問題なのか(ファイルがない、読み取り専用など)を正確に知ることもできます。

Delphiで例外を処理する方法を説明する良い記事があります。

もう1つ指摘すべきことは、例外が表示されたときです。デバッグモード(IDEからアプリケーションを実行している)の場合、アプリケーションが単独で実行されているときに表示されない例外も含め、デフォルトですべての例外が表示されます。IDEでこれを無効にすることができます。その記事はDelphi2007に関するものですが、同じオプションがDelphi XE2にもあるため、2010にも適用されるはずです。

于 2012-08-18T03:27:23.910 に答える
-1

を使って解く

try

exception
on e: exception do
ShowMessage("My Message");

Try/Finally の代わりに。

于 2012-08-17T17:36:46.263 に答える