我正在使用Delphi 7并尝试处理在程序运行期间抛出的所有可能异常。我用过Application.OnException:= HandlerProcedure;处理异常,但是当异常发生时,HandlerProcedure永远不会被调用。为了确保它是否真的有效,我在分配Application.OnException之后引发了异常,如下所示:
Application.OnException := HandlerProcedure;
raise Exception.Create('Exception');
并将HandlerProcedure定义为:
procedure TFormMain.HandlerProcedure(Sender: TObject; E: Exception);
begin
ShowMessage('Exception.');
Exit;
end;
但HandlerProcedure从未被调用过。如何处理所有异常?
答案 0 :(得分:12)
如果要拦截所有异常,则需要实现RTLUnwindProc
低级别过程。
这有点低级(例如它需要asm技能),因此您最好依赖现有代码。见this stack overflow question。我甚至在my own answer中添加了一些参考代码(包括低级asm,在Win32下使用Delphi 7和更高版本)。
答案 1 :(得分:2)
您的代码出了问题。来自Embarcadero网站的example工作正常。
{
In addition to displaying the exception message, which
happens by default, the following code shuts down the
application when an exception is not caught and handled.
AppException should be declared a method of TForm1.
}
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := AppException;
end;
procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
Application.ShowException(E);
Application.Terminate;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
raise EPasswordInvalid.Create('Incorrect password entered');
end;
还描述了在Delphi上处理错误的良好实践here。 为了进一步调查您遇到的问题,您应该查看此https://stackoverflow.com/questions/1259563/good-os-delphi-exception-handling-libraries
答案 2 :(得分:0)
如果您使用的是第三方异常处理程序(如madExcept),Application.OnException将不再触发。您必须改为编写TMadExceptionHandler.OnException事件或直接调用RegisterExceptionHandler。