简化代码解释:
procedure unhandled(); begin raise Exception.Create('Unhandled'); end;procedure ExceptionHandler(ExceptObject: TObject; ExceptAddr: Pointer); begin WriteLn('display: ' + Exception(ExceptObject).Message); //send Message Here end;
我调用此代码来运行它:
WriteLn('Starting'); ExceptProc := @ExceptionHandler; unhandled();
我希望输出为:
Starting
display: Unhandled
但它只是显示:
Starting
然后windows在大约5秒后返回命令提示符.
为什么处理程序没有被正确调用?
附:我一直在控制台应用程序中运行这些测试以进行测试.
编辑:
以下是一些更多信息:
显然,当您有一个已分配的ExceptProc时,您的程序不应抛出正常的运行时217错误.我猜这是windows正在捕捉的内容,但是我可以看到,我的程序正在抛出运行时错误,我也无法获得ErrorProc来捕获它.
解决方法 您缺少对 SetErrorMode()的调用:SetErrorMode(SEM_NOGPFAulTERRORBox);
这是为了防止OS unhandled exception filter显示对话框/显示调试器附加对话框.这是一个完整的示例,在我的机器上表现得如预期:
{$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.
请注意,SetErrorMode()的效果在运行进程中的所有线程中都是全局的.
总结以上是内存溢出为你收集整理的delphi – 在Windows中不调用ExceptProc全部内容,希望文章能够帮你解决delphi – 在Windows中不调用ExceptProc所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)