6

Delphi による例外キャッチを無効にして、Windows にキャッチさせたい - 「AppName がクラッシュしました。デバッグ、送信」のようなウィンドウを生成し、これをアプリケーション イベントに追加し、メモリ ダンプを作成します。

デフォルトでは、Delphi は TApplication.Run プロシージャですべての例外をキャッチします... Forms.pas を変更せずにそれを回避するにはどうすればよいですか?

4

4 に答える 4

8

OnException例外を再発生させるハンドラーを追加できます。

class procedure TMainForm.OnException(Sender: TObject; E: Exception);
begin
  raise Exception(AcquireExceptionObject);
end;

initialization
  Application.OnException := TMainForm.OnException;

しかし、なぜあなたがこれをやりたいのかはわかりません。madExceptやEurekaLogなどのツールを使用して、システムダイアログよりもはるかに役立つ情報を生成するエラーダイアログを表示するのが一般的です。

于 2012-08-26T18:08:54.957 に答える
4

JITEnable'1' 以上に設定できます (デフォルトは '0' です)。'1' の場合は非ネイティブ例外で、'1' より大きい場合は、すべての例外が JIT または WER によって処理されます (システムによって異なります)。

これはあなたが望むものではないかもしれません。このソリューションでは、例外がコードで処理されているかどうかに関係なく、OS に例外が渡されます。明確化 (デバッガーの外部で実行):

procedure TForm1.Button1Click(Sender: TObject);
begin
  raise EAccessViolation.Create('access denied');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  try
    PInteger(0)^ := 0;
  except
  end;
end;

initialization
  JITEnable := 1;

最初の例はネイティブ例外で、 が 1 の場合にアプリケーションの例外処理メカニズムによって処理されJITEnableます。しかし、2 番目の例は JIT/WER をトリガーします。

于 2012-08-26T22:53:47.587 に答える
3

独自のハンドラーを追加します。Application.OnExceptionおそらくあなたが望むものです。環境に応じて異なる動作が得られるため、Windows に任せるよりも優れています。たとえば、Windows エラー報告がオンになっている場合、エラー報告を MS に送信するかどうかをユーザーに尋ねます。

Mr Heffernan のように、EurekaLog のようなものを見ることをお勧めします。

于 2012-08-26T18:23:24.450 に答える
1

なので。この願いはかなり奇妙だという上記の声に同意します。また、TApplication.OnException を実際にフックするだけで十分だという点にも同意します (「アヒルのように見える場合...」)。

ただし、RTL で例外を無視したい場合は、方法もあります。

例外ハンドラは、ヒープ管理などと同様に、低レベル RTL へのプラグインです。

KOL (Key Objects Library) を見ることができます。Delphi で 5 回、2KB サイズの DLL を作成することができました。

それには、「当然の」機能と考えられている多くの通常の機能がないことが必要でした。その中に例外がありました。

KOL のシステム RTL 置換で例外を有効にするには、いくつかの $DEFINE を作成する必要があり、その後、IDE に例外サポートを追加するコードのロックが解除されました。

モジュール化された RTL バージョンを取得し、その $IfDef を grep して、どのコードがどのコードに置き換えられているかを確認できると思います。それを元に戻し、Windows が例外を介して Delphi RTL を呼び出さないようにすることができる可能性は十分にあると思います。詳細は覚えていませんが、Delphi RTL Exception ハンドラがコールバックとして Windows コアに登録されているだけだと思います。そして、おそらくそれを登録解除できます(nilコールバックを登録してください)。ストックRTLで見つかると思いますが、KOLのモジュール化されたRTLは検索を容易にするだけです.

于 2012-08-27T07:54:36.403 に答える