Chr*_*s J 4 delphi exception-handling exception
我目前正在尝试创建一个内置在我的Windows服务中的异常处理程序,在未处理的异常中,它将消息发送到另一个程序.我已经构建了方法并使通信工作,但似乎每次我的程序抛出错误,(我在代码中有一个加注调用来强制它.)windows捕获它而不调用Handler.谁能解释我做错了什么?
简化代码解释:
procedure unhandled();
begin
raise Exception.Create('Unhandled');
end;
procedure ExceptionHandler(ExceptObject: TObject; ExceptAddr: Pointer);
begin
WriteLn('Display: ' + Exception(ExceptObject).Message);
//send Message Here
end;
Run Code Online (Sandbox Code Playgroud)
我调用此代码来运行它:
WriteLn('Starting');
ExceptProc := @ExceptionHandler;
unhandled();
Run Code Online (Sandbox Code Playgroud)
我希望输出为:
开始
显示:未处理
但它只是显示:
开始
然后Windows在大约5秒后返回命令提示符.
为什么处理程序没有被正确调用?
PS我一直在控制台应用程序中运行这些测试进行测试.
编辑:
以下是一些更多信息:
显然,当您有一个已分配的ExceptProc时,您的程序不应抛出正常的运行时217错误.我猜这是Windows正在捕捉的内容,但是我可以看到,我的程序正在抛出运行时错误,我也无法获得ErrorProc来捕获它.
您缺少对SetErrorMode()的调用:
SetErrorMode(SEM_NOGPFAULTERRORBOX);
Run Code Online (Sandbox Code Playgroud)
这是为了防止操作系统未处理的异常过滤器显示对话框/显示调试器附加对话框.这是一个完整的示例,在我的机器上表现得如预期:
{$apptype console}
uses Windows, SysUtils;
procedure unhandled();
begin
raise Exception.Create('Unhandled');
end;
procedure ExceptionHandler(ExceptObject: TObject; ExceptAddr: Pointer);
begin
Writeln('here');
WriteLn('Display: ' + Exception(ExceptObject).Message);
Flush(Output);
Halt(1);
end;
procedure Go;
begin
unhandled;
end;
begin
ExceptProc := @ExceptionHandler;
SetErrorMode(SEM_NOGPFAULTERRORBOX);
Go;
end.
Run Code Online (Sandbox Code Playgroud)
请注意,SetErrorMode()的效果在运行进程中的所有线程中都是全局的.
| 归档时间: |
|
| 查看次数: |
741 次 |
| 最近记录: |