【发布时间】:2010-07-05 05:41:47
【问题描述】:
我有一个用 Delphi 2007 编写的服务,我正在尝试捕获任何未知异常。为 on 异常分配方法似乎不起作用('Forms.Application.OnException:=UnknownApplicationException')。 'UnknownApplicationException' 似乎没有被调用——我将此归因于应用程序中没有表单,因此该方法实际上从未被分配。除此之外,我还尝试在计时器上创建一个异常(在注释掉“Forms.Application.OnException:=UnknownApplicationException”以便它不会干扰之后)。定时器在服务启动 60 秒后触发:
procedure TProcessScheduler.Timer1Timer(Sender: TObject);
begin
try
Raise Exception.Create('THIS GIG SUCKS');
except
LogEvent(Name,rsUNKNOWN_EXCEPTION,EVENTLOG_AUDIT_FAILURE,0);
ExitCode:=-1;
Halt;
end;
end;
该异常似乎从未被捕获 - 服务启动,并且在此计时器触发 60 秒后,我听到 Windows 错误声音但没有看到任何错误对话框 - 这可能是由于应用程序是服务吗? 'Halt' 永远不会被调用并且应用程序继续运行(我假设它正在等待某人在它创建的不可见错误对话框上单击确定)。任何想法为什么不调用“除外”下的代码?提前致谢! KP
【问题讨论】:
-
由于您的
except捕获并处理异常,它永远不会到达Application.OnException事件。除了Halt之外ExitCode := -1是否也被跳过了?如果是这样,那么问题出在LogEvent内部,您应该发布一些代码来显示LogEvent的作用。 -
他谈到了一个对话框,但他传递了一个事件日志参数 (EVENTLOG_AUDIT_FAILURE),在这种情况下这是错误的,用于写入安全日志的 IIRC,但从 XP SP2 开始不再起作用(使用 AuthzReportSecurityEvent)。可能他应该使用类似 EVENTLOG_ERROR_TYPE 的东西,但是没有 LogEvent 代码就很难说。
标签: delphi exception-handling delphi-2007