Delphi: mapping of COM/Windows exceptions to Delphi Exceptions and run-time errors
Posted by jpluimers on 2014/07/30
Every time
[sourcecode language=”text”]
—————————
Debugger Exception Notification
—————————
Project Some.exe raised exception class $C0000005 with message ‘access violation at 0x00537b14: read of address 0x00000000’.
—————————
Break Continue Help
—————————
‘Exception "EAccessViolation" with message "Access violation at address 00537B30 in module ”TestWordInterface.exe”. Read of address 00000000" at address 00537B30’
—————————
Testwordinterface
—————————
Access violation at address 00537B14 in module ‘Some.exe’. Read of address 00000000.
—————————
OK
—————————
[/sourcecode]
In system.pas:
[sourcecode language=”text”]
{$IFDEF STACK_BASED_EXCEPTIONS}
procedure MapToRunError(P: PExceptionRecord); stdcall;
const
STATUS_ACCESS_VIOLATION = $C0000005;
STATUS_ARRAY_BOUNDS_EXCEEDED = $C000008C;
STATUS_FLOAT_DENORMAL_OPERAND = $C000008D;
STATUS_FLOAT_DIVIDE_BY_ZERO = $C000008E;
STATUS_FLOAT_INEXACT_RESULT = $C000008F;
STATUS_FLOAT_INVALID_OPERATION = $C0000090;
STATUS_FLOAT_OVERFLOW = $C0000091;
STATUS_FLOAT_STACK_CHECK = $C0000092;
STATUS_FLOAT_UNDERFLOW = $C0000093;
STATUS_INTEGER_DIVIDE_BY_ZERO = $C0000094;
STATUS_INTEGER_OVERFLOW = $C0000095;
STATUS_PRIVILEGED_INSTRUCTION = $C0000096;
STATUS_STACK_OVERFLOW = $C00000FD;
STATUS_CONTROL_C_EXIT = $C000013A;
var
ErrCode: Byte;
begin
case P.ExceptionCode of
STATUS_INTEGER_DIVIDE_BY_ZERO: ErrCode := 200; { reDivByZero }
STATUS_ARRAY_BOUNDS_EXCEEDED: ErrCode := 201; { reRangeError }
STATUS_FLOAT_OVERFLOW: ErrCode := 205; { reOverflow }
STATUS_FLOAT_INEXACT_RESULT,
STATUS_FLOAT_INVALID_OPERATION,
STATUS_FLOAT_STACK_CHECK: ErrCode := 207; { reInvalidOp }
STATUS_FLOAT_DIVIDE_BY_ZERO: ErrCode := 200; { reZeroDivide }
STATUS_INTEGER_OVERFLOW: ErrCode := 215; { reIntOverflow}
STATUS_FLOAT_UNDERFLOW,
STATUS_FLOAT_DENORMAL_OPERAND: ErrCode := 206; { reUnderflow }
STATUS_ACCESS_VIOLATION: ErrCode := 216; { reAccessViolation }
STATUS_PRIVILEGED_INSTRUCTION: ErrCode := 218; { rePrivInstruction }
STATUS_CONTROL_C_EXIT: ErrCode := 217; { reControlBreak }
STATUS_STACK_OVERFLOW: ErrCode := 202; { reStackOverflow }
else ErrCode := 255;
end;
RunErrorAt(ErrCode, P.ExceptionAddress);
end;
[/sourcecode]






Leave a Comment