答えて
JclHookExcept
ユニットのJclAddExceptNotifier
をご覧ください。
これはJCLベースではありませんが、完全なオープンソースであり、Delphi 5からXEまで動作します。
このlogging mechanismは、例外を傍受することができます。
実際には、デルファイ6以来、あなたはどの例外が発生したときlauchedすることがRtlUnwindProcでグローバルな手順を定義することができますが:
{$ifdef DELPHI5OROLDER}
procedure RtlUnwind; external kernel32 name 'RtlUnwind';
{$else}
var
oldUnWindProc: pointer;
{$endif}
procedure SynRtlUnwind(TargetFrame, TargetIp: pointer;
ExceptionRecord: PExceptionRecord; ReturnValue: Pointer); stdcall;
asm
pushad
cmp byte ptr SynLogExceptionEnabled,0
jz @oldproc
mov eax,TargetFrame
mov edx,ExceptionRecord
call LogExcept
@oldproc:
popad
pop ebp // hidden push ebp at asm level
{$ifdef DELPHI5OROLDER}
jmp RtlUnwind
{$else}
jmp oldUnWindProc
{$endif}
end;
oldUnWindProc := RTLUnwindProc;
RTLUnwindProc := @SynRtlUnwind;
このコードは、次の機能を起動します:
type
PExceptionRecord = ^TExceptionRecord;
TExceptionRecord = record
ExceptionCode: DWord;
ExceptionFlags: DWord;
OuterException: PExceptionRecord;
ExceptionAddress: PtrUInt;
NumberParameters: Longint;
case {IsOsException:} Boolean of
True: (ExceptionInformation : array [0..14] of PtrUInt);
False: (ExceptAddr: PtrUInt; ExceptObject: Exception);
end;
GetExceptionClass = function(const P: TExceptionRecord): ExceptClass;
const
cDelphiExcept = $0EEDFAE0;
cDelphiException = $0EEDFADE;
procedure LogExcept(stack: PPtrUInt; const Exc: TExceptionRecord);
begin
LastError := GetLastError;
(...) intercept the exception
SetLastError(LastError); // code above could have changed this
end;
Delphi 5の場合、I had to patch the VCL in-processは、グローバル例外インターセプタがないためです。
+1、興味深い –
非常に興味深い、あなたの答えのおかげで! –
最新バージョンは、XE4/XE5、Win32/Win64プラットフォームをサポートしています。 –
- 1. スローされた例外(処理された例外も含む)についての通知を取得する
- 2. Cで未処理の例外をキャッチする方法は?
- 3. 未処理の例外をキャッチする
- 4. アンドロイドで例外メモリ例外を処理する方法は?
- 5. 外部アセンブリで処理される例外をキャッチ
- 6. 処理された例外をキャッチする
- 7. 例外処理を含むPL/SQLファンクション
- 8. フィルタでスローされた例外を処理する方法は?
- 9. 例外をキャッチしてJavaで処理を続ける方法
- 10. すべてのjavascript未処理の例外をキャッチ
- 11. すべての未処理の例外をキャッチ
- 12. 処理されない例外と停止方法をキャッチしますか?
- 13. iOS +未処理の例外をキャッチする方法
- 14. WebServiceからすべての例外をキャッチする方法は?
- 15. ローカライズされた例外を処理する方法は?
- 16. 例外をキャッチして別の例外をスローする方法
- 17. 例外処理戦略 - リポジトリから例外をキャッチしてWebApiコントローラに渡す
- 18. すべての例外を処理する方法
- 19. サービスファブリックで処理されていないすべての例外をキャッチする正しい方法ReceiveReminderAsync
- 20. キャッチされた例外をキャッチする方法
- 21. アクセスできない例外を処理する方法はありますか?
- 22. クリティカルセクションでスローされた例外をキャッチする方法は?
- 23. Windows phone 7アプリケーションで未処理の例外をキャッチする方法はありますか?
- 24. 例外としてキャッチされない例外をスローする方法
- 25. マルチパート例外を処理する方法
- 26. データアクセス例外を処理する方法
- 27. HttpAsyncClient例外を処理する方法
- 28. Task.Status.Faulted - 例外を処理する方法
- 29. Python:別の方法で未処理の例外を処理する方法はありますか?
- 30. ForkJoinPoolでキャッチされていない例外を処理するためのより良い方法タスク/アクション
ありがとうございました。私もgoogledこれhttp://andremussche.blogspot.com/2007/09/adv-debugging-hook-all-exceptions.html –
@Melaum:おそらく非常に興味深いですが、残念ながら私はドイツ語を話しません。 (それがドイツ語でないなら、それが何であれ、私はそれも話さない) –
それはドイツ語ではなく、オランダ語です。 – jpfollenius