回答
看看JclAddExceptNotifier
在JclHookExcept
單位。
這不是基於JCL的,但它是完整的開放源代碼,並從Delphi 5直到XE。
這logging mechanism是能夠攔截任何異常。
事實上,自從德爾福6,您可以在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. 有沒有辦法來處理規則捕獲所有ANTLR異常類型[...]
- 2. 捕獲所有未處理的異常
- 3. 異步異常沒有被捕獲
- 4. C++異常沒有被捕獲捕獲(異常型)
- 5. C#的異常沒有被捕獲
- 6. 捕獲所有異常
- 7. 捕獲所有異常
- 8. 爲什麼win32異常沒有被C#異常處理機制捕獲
- 9. 捕獲的異常沒有被使用的最佳做法
- 10. java parseInt異常沒有被捕獲
- 11. Python異常沒有被捕獲
- 12. FOSRestBundle沒有捕獲異常
- 13. 處理所有異常
- 14. 有沒有辦法用Python單擊自動處理異常?
- 15. 捕獲所有(已處理或未處理)異常
- 16. 有沒有辦法知道異常是否被禁用?
- 17. 獲取IMethod捕獲的所有異常
- 18. 有沒有辦法阻止從sys.exit()引發的SystemExit異常被捕獲?
- 19. 捕獲塊沒有捕獲異常
- 20. 捕獲所有的javascript未處理的異常
- 21. 有沒有辦法在OSB中處理自定義Java異常?
- 22. 有沒有更好的方法來處理轉換異常?
- 23. Application.OnException無法處理所有異常 - Delphi
- 24. 有沒有辦法忽略所有的xml解析異常?
- 25. 是否有可能捕獲除運行時異常外的所有異常?
- 26. 是否有可能使用aspectj捕獲所有異常?
- 27. 使用Qt Creator編譯時,我的異常沒有被捕獲
- 28. 捕捉異常而沒有捕獲塊
- 29. PostgreSQL的try-catch沒有捕獲異常
- 30. @Around(AspectJ)中沒有捕獲的異常
謝謝你,這對我很有幫助。我也google了這個http://andremussche.blogspot.com/2007/09/adv-debugging-hook-all-exceptions.html –
@Melaum:這可能非常有趣,但不幸的是我不會說德語。 (或者,如果那不是德國人,不管它是什麼,我也不會這麼說。) –
這不是德國人,而是荷蘭人。 – jpfollenius