Application.OneException无法处理所有异常-Delphi

Application.OneException无法处理所有异常-Delphi,delphi,delphi-7,Delphi,Delphi 7,我正在使用Delphi7,试图处理程序运行期间抛出的所有可能的异常。我使用了Application.oneexception:=HandlerProcedure;处理异常,但当异常发生时,不会调用HandlerProcedure。为了确保它是否真的有效,我在分配Application.OneException后引发了异常,如下所示: Application.OnException := HandlerProcedure; raise Exception.Create('Exception');

我正在使用Delphi7,试图处理程序运行期间抛出的所有可能的异常。我使用了Application.oneexception:=HandlerProcedure;处理异常,但当异常发生时,不会调用HandlerProcedure。为了确保它是否真的有效,我在分配Application.OneException后引发了异常,如下所示:

Application.OnException := HandlerProcedure;
raise Exception.Create('Exception');
并将HandlerProcedure定义为:

procedure TFormMain.HandlerProcedure(Sender: TObject; E: Exception);
begin
    ShowMessage('Exception.');      
    Exit;
end;

但handler程序从未被调用过。如何使其处理所有异常?

如果要拦截所有异常,需要实现RTLUnwindProc低级过程


这有点低级,例如,它需要asm技能,因此您最好依赖现有代码。看见我甚至在中加入了一些参考代码,包括低级asm、在Win32下使用Delphi 7和更高版本。

如果您想拦截所有异常,您需要实现一个RTLUnwindProc低级过程


这有点低级,例如,它需要asm技能,因此您最好依赖现有代码。看见我甚至把一些参考代码,包括低级asm,在Win32下使用Delphi 7和更高版本。

您的代码中有些错误。来自Embarcadero网站的数据工作正常

{
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上处理错误的良好实践。
为了进一步调查您遇到的问题,您应该查看一下代码中的错误。来自Embarcadero网站的数据工作正常

{
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上处理错误的良好实践。

为了进一步调查您遇到的问题,如果您正在使用第三方异常处理程序,如MadException,Application.OneException不再触发,则应查看此问题。您必须编写TMadExceptionHandler.OnException事件代码或直接调用RegisterExceptionHandler。

如果您使用第三方异常处理程序(如MadException),Application.OnException将不再激发。您必须改为编写TMadExceptionHandler.OneException事件或直接调用RegisterExceptionHandler。

实际代码中不存在不同名称的HandleImportScheduleException和HandlerProcedure?请提供SSCCE。很可能是在Application.Run.Oh之前引发异常。但这在我的真实代码中并不存在。刚刚编辑了问题,我们需要一个SSCCE。在您显示代码之前,我们无法告诉您出了什么问题。请提供SSCCE。在提问时,您应该始终这样做。似乎您有一个新的首字母缩略词:不同的名称HandleImportScheduleException和HandlerProcedure在您的实际代码中不存在?请提供SSCCE。很可能是在Application.Run.Oh之前引发异常。但这在我的真实代码中并不存在。刚刚编辑了问题,我们需要一个SSCCE。在您显示代码之前,我们无法告诉您出了什么问题。请提供SSCCE。当你问一个问题时,你应该总是这样做。似乎你有了一个新的最喜欢的缩写词:很可能是这个糟糕的建议。我希望asker所需要的只是修复他们的bug,从而调用OneException。“这个答案充其量是误导性的。”DavidHeffernan OP写道,他试图处理程序运行期间抛出的所有可能的异常。。。听起来如果我的回答符合这个问题,不是吗?Asker肯定不理解你推断投票的细微差别,因为你认为OP潜在的细微差别是相当不公平的。谷歌搜索“处理Delphi程序的所有异常”肯定会指向这个问题。我有时受够了如此低落的选民。我个人认为你应该得到+1,因为你试图把有用的信息放在那里+我的建议。很可能是这个糟糕的建议。我希望asker所需要的只是修复他们的bug,从而调用OneException。“这个答案充其量是误导性的。”DavidHeffernan OP写道,他试图处理程序运行期间抛出的所有可能的异常。。。听起来如果我的回答符合这个问题,不是吗?Asker肯定不理解你推断投票的细微差别,因为你认为OP潜在的细微差别是相当不公平的。谷歌搜索“处理Delphi程序的所有异常”肯定会指向这个问题。我有时受够了如此低落的选民。我个人认为你应该得到+1,因为你试图把有用的信息放在那里+从我这里得到1。