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

时间:2014-08-19 22:26:10

标签: delphi

我希望显示自定义错误消息,而不是系统生成的错误消息。具体来说,在这种情况下,如果用户试图打开已经在使用的文件,我想捕获错误并显示我的消息,但系统总是打败我并生成以下消息:" Project ...引发异常类EFOpenError,带有消息'无法打开文件"文件路径和名称"。该进程无法访问该文件,因为该文件正由另一个进程使用。"。当我关闭此错误消息时,即显示我的消息。我想只显示我的信息。我不希望显示系统消息。有没有办法做到这一点?我的代码不起作用。

这是我的代码:

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;

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

因此,如果您生成自定义消息,那么将显示该消息。但是你不需要显示信息。您可能希望默默处理该异常。

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

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;

正如您在第一个try..except..end块中的示例中看到的那样,我们静默处理异常但是在下一个try..except..end块中嵌套在第一个try..except的except块中..结束;阻止我们最终向用户显示消息。

虽然这通常被认为是不好的做法,但有时你可能甚至不想显示任何消息,而不是这样的错误。例如,如果你正在制作一些系统服务或后台进程,那么你肯定不想要的就是用一堆错误消息来打扰用户。对于进一步调试,有必要在一些日志中写入错误仍然是好的。

现在,如果你的应用程序是在Delphi IDE之外运行的(不是debuging),或者你在IDE中转换了特定的异常检测,那么except块中的代码将直接触发。当引发特定异常时。

编辑:删除了不相关的文字。

相关问题