4

私たちのアプリケーションの 1 つで、見つけたりトラップしたりできないような例外が発生しました。

...
  Application.CreateForm(TFrmMain, FrmMain);
  outputdebugstring(pansichar('Application Run')); //this is printed
  Application.Run;
  outputdebugstring(pansichar('Application Run After')); //this is printed
end.
<--- The Exception seems to be here    

イベントログが表示されます

> ODS: Application Run 
> //Various Application Messages 
> ODS: Application Run After
> First Change Exception at $xxxxxxxx.  ...etc

私が考えることができるのは、ユニットの1つのファイナライズコードです。

(デルファイ 7)

4

4 に答える 4

5

MadExceptをインストールしてみてください。例外がキャッチされ、スタック トレースが表示されます。

同様の問題が発生したときに役立ちました。

于 2008-09-25T02:54:34.620 に答える
4

次の 2 つのことを試すことができます。

1) 最後の 'end.' で 'F7' を押すと簡単です。これにより、他のファイナライズ ブロックに進みます。

2) Application.OnException イベントをオーバーライドしてみてください。

于 2008-09-25T03:12:57.913 に答える
4

SysUtils ユニットは、実際には初期化セクションでデフォルトの ErrorProc および ExceptProc プロシージャを設定し、ファイナライズ セクションでそれらを元に戻します。そのため、多くの場合、この状況では、SysUtils が dpr の uses 句の最初のユニットであることを確認する価値があります。それはファイナライズされた最後のものになります。何がうまくいかないかについての意味のあるデータを得るには十分かもしれません。

于 2008-09-25T03:31:13.750 に答える
2

ファイナライズの例外は扱いにくいです。プロジェクト ファイルの最初にSysUtlsを配置したとしても、アプリケーション オブジェクトは既になくなっている可能性があります。つまり、グローバル例外ハンドラもなくなっています。 ただし、 MadExceptはこれで機能する場合があります。

もう 1 つの解決策は、各ユニットのファイナライズセクションにTry / Exceptブロックを配置し、そこで例外を処理することです。

あなたの目的は何ですか?例外を抑制しますか、それともデバッグしますか? Zartogが提案したように、 F7でそれらをステップスルーすることでデバッグできます。ファイナライズでどのユニットに例外があるかがわかった場合は、そのユニットが呼び出された uses 句に別の順序で配置してみてください。

幸運を!

于 2008-09-25T05:41:38.383 に答える