2012-03-23 11 views
1

私は複数のスレッドを実行するアプリケーションを持っています。 MadExceptを使用してエラーを捕捉し、デバッグします。MadExceptで致命的なアプリケーションエラーが発生しない

問題は、2-3時間の実行後にWindowsがクローズプログラムダイアログを表示することがあることです。 MadExceptがそのエラーを処理しないのはなぜですか?

+3

エラーがDelphiの例外ロジック外で起こっていて、MadExceptが捕捉できるものの外にある場合は、私のコントロールコードで何かが間違っていることがわかり、それを適切に処理したり、 MadExceptができることは何もない。しかし、実際のエラーに関する情報はありませんでした(「クローズプログラムダイアログ」は役に立ちません)。それが近いダイアログであれば、私は**考えているかもしれませんが(確信はありませんが、Windowsのどちらのバージョンも言っていないので)、エラーレポートとスタックトレースを見て表示する方法があります実際にどのようなエラーが発生していますか。私はここからそれを見ることができないので、私ははるかに助けになることはできません。 :) –

+0

私はWindows 7を使用していますが、それ以上の情報はありません: "プログラムはエラーとウィンドウを検出しました..." – opc0de

+0

エラーレポートを表示するリンクがあります。バグレポートの送信を許可すると、MSに送信されるテキストファイルです。そのテキストファイルの中には、問題を把握するのに役立つコールスタックやその他の情報(例外コード、レジスタ内容、命令ポインタ情報など)があります。 –

答えて

1

スレッドは特殊なケースです。スレッドに例外がある場合、グローバルハンドラで処理されず、通常はアプリケーションが終了します。しかし、madExceptを使って簡単に解決できます。ただ例外をキャッチし、それについてMadExceptに伝えてください。通常の方法でログインし、あなたのスレッドを殺すことはありません。

uses 
{$IFDEF MadExcept} 
madExcept, 
{$ENDIF} 


procedure TMyThread.Execute; 
begin 
    try 
     SetName; 
    // do your stuff 

    except 
    on errInfo : Exception do 
    begin 
{$IFDEF MadExcept} 
     HandleException(etNormal, errInfo); 
{$ENDIF} 
    end; 
    end; 
end; 

私がやっていることは、スレッドが起動時に "RunningOK"プロパティをtrueに設定し、例外がFalseに設定されていることです。

+0

@David申し訳ありませんが、従ってください? madExceptなしでコンパイルしたい場合は、これを行うことができます。 HandleExceptionはmadExcept固有のものなので、持っていなければ明らかに無視する必要があります。しかし、通常のmadExceptで例外のトレースを得ることもできます。 – mj2008

+0

それは、例外的な細部をつかみたいと思っていたときに、これを行うべきだとマティアスが言ったからです。 – mj2008

関連する問題