在Delphi中显示自定义错误消息而不是系统错误消息

在Delphi中显示自定义错误消息而不是系统错误消息,delphi,Delphi,我希望显示我的自定义错误消息,而不是系统生成的错误消息。具体地说,在这种情况下,如果用户试图打开一个已经在使用的文件,我希望捕获错误并显示我的消息,但系统总是会提示我,并生成以下消息:“Project…引发的异常类EFOpenError,带有消息‘Cannot open file’”文件路径和名称“。该进程无法访问该文件,因为它正被另一个进程使用。”“当我关闭此错误消息时,即显示我的消息。我只希望显示我的消息。我不希望显示系统消息。是否有方法执行此操作?我的代码不起作用 这是我的密码: begi

我希望显示我的自定义错误消息,而不是系统生成的错误消息。具体地说,在这种情况下,如果用户试图打开一个已经在使用的文件,我希望捕获错误并显示我的消息,但系统总是会提示我,并生成以下消息:“Project…引发的异常类EFOpenError,带有消息‘Cannot open file’”文件路径和名称“。该进程无法访问该文件,因为它正被另一个进程使用。”“当我关闭此错误消息时,即显示我的消息。我只希望显示我的消息。我不希望显示系统消息。是否有方法执行此操作?我的代码不起作用

这是我的密码:

begin
 //check if input file can be opened
      try
        if OpenDialog1.Execute then
        begin
          Application.ProcessMessages;
          Memo1.Clear;
          try
            Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
            InputFile := TStringList.Create;
            InputFile.LoadFromFile(OpenDialog1.FileName);
            ActiveFileName := ExtractFileName(OpenDialog1.FileName);
            lblActiveFileName.Caption := 'Active File: ' + ActiveFileName;
            mmuDisplayClear.Enabled := True;
            mmuAnalysisOptions.Enabled := True;
          except on
            EFOpenError do //if file does not exist or is in use
            MessageDlgPos('File either does not exist or may be ' +
                 'in use!', mtError, [mbOK], 0, 300, 300);
          end;
        end;
      finally
        mmuDispInstructions.Enabled := True;
        mmuDispData.Enabled := False;
      end;
end;

您将看到调试器在应用程序捕获异常之前捕获异常。这是完全正常的行为。只需按F9键将异常传递给应用程序进行正常处理。如果不希望调试器显示异常,请将异常类类型放入调试器的忽略列表中,或换行断点中的代码,用于禁用/启用调试器的异常处理。

当您通过Delphi IDE运行应用程序(对其进行调试)并从try..except..end子句中引发异常时,IDE将首先检测到异常,然后如果您按F9,则将触发except块中的代码

所以,如果您在那里生成自定义消息,该消息将被显示。但您不需要显示消息。您可能希望以静默方式处理该异常

让我们看一看下一个示例:您正试图建立到某个服务器的网络连接。在建立连接的调用中,您指定了某个超时,在此超时之后,要连接的atempt将被视为失败。在该超时过期后,大多数网络组件会引发一个Etimeout异常,以便您知道建立连接wa UNSCSESSFULL。但由于网络有时的行为方式,您可能希望在向用户显示错误之前重试atempt以再次连接到服务器。您可以通过在except块中再次调用connect方法来执行此操作,以便在不出现任何错误的情况下启动另一个atempt。因此代码看起来像这:

Timeout := 2000;
try
  NetworkComponent.Connect(Timout);
except
  try
    NetworkComponent.Connect(Timeout);
  except
    MessageDlgPos('Connection could not be established!, 
                   mtError, [mbOK], 0, 300, 300);
  end;
end;
正如您在first try..exception..end block的示例中所看到的,我们以静默方式处理异常,但在下一个try..exception..end block中,它嵌套在first try..exception..end;block的except块中,我们最终将消息显示给用户

虽然这通常被认为是一种不好的做法,但有时您甚至不想显示有关此类错误的任何消息。例如,如果您正在进行某些系统服务或后台进程,您肯定不想用大量错误消息来打扰用户。至少在一些日志f中写入错误是好的或进一步调试

现在,如果您的应用程序在DelphiIDE之外运行(不进行调试),或者如果您在IDE中打开特定的异常检测,那么except块中的代码将直接触发


编辑:删除不相关的文本。

您是在谈论程序是否在IDE中运行时会发生什么?听起来像是前者。如果是这样,请在调试器设置中关闭“停止语言异常”(旧的Delphi版本)或工具|调试器选项| Embarcadero调试器|语言异常,通知语言异常。不知道这一点。它起作用了。谢谢。最好使用自定义消息引发异常。
raise exception.Create('File不存在或可能正在使用!')
。此消息在标准对话框中显示。如果要处理演示文稿,只需为
应用程序指定一个方法。OneException
并根据需要演示所有异常,最后的代码看起来完全错误。值得特别注意的是,在de中运行应用程序时,只能看到调试器异常IDE中的错误-普通最终用户看不到第一条消息(或任何异常消息)在一个
try
块中提出,该块是为处理给定类的异常而编写的。我认为@J…对异常有着非常坚实的理解。J…的理解与问题的答案有什么关系?如果必须的话,请评论。老实说,我起初只是试图给出一个简短的评论,但后来它在解释Delphi如何处理异常的完整答案。