【问题标题】:How not to show system messages - Delphi如何不显示系统消息 - Delphi
【发布时间】:2012-08-17 17:16:38
【问题描述】:

考虑这部分代码:

Try
  arqTXT.LoadFromFile(LogPath);
finally
  ShowMessage(" The log file could not be found. Check if the service is running. ");
end;

在我的消息之后,会出现一条系统消息,其中包含以下消息:无法打开文件“C:\log.txt”。有没有办法不显示此系统消息?

我使用的是 Delphi 2010

谢谢。

【问题讨论】:

  • 什么类型的消息?您使用的是什么 IDE?我从 RAD Studio XE2 知道,一旦引发异常,它就会输出所有异常,无论它们是否被捕获。那是设置的问题。它不会出现在“真实”程序中。
  • 我使用的是 Delphi 2010。我刚刚编辑了我的问题。
  • 它只会在调试模式下显示。您也可以在设置中禁用它。
  • 该错误可能是因为您尝试读取的文件已被其他程序打开。
  • @Blobby - 或文件不存在等

标签: delphi file delphi-2010


【解决方案1】:

您希望捕获该特定异常(EInOutError,如果我没记错的话)并让其他发生的异常保持不静音。因此,如果您遇到其他一些异常(例如 EOutOfMemory),如果不会被“吞下”,那么您的代码看似可以正常工作但已损坏。

try
  ..
except
  on E: EInOutError do
        begin
          ..
        end;
end;

您可以在一个构造中包含多个异常处理程序。任何未处理的异常都将继续在 try .. except 块之外传播,直到在其他地方被捕获(例如,默认情况下显示错误框的异常处理程序)。

【讨论】:

  • 不需要`else raise;'。任何不是源自 EInOutError 的异常都将在没有它的情况下“失败”。
【解决方案2】:

有几点需要指出。正如其他答案/cmets 解释的那样,您应该将代码包装在 try..except 块中,而不是 try..finally 块中。我不明白您的代码示例应该如何工作,因为正如当前编写的那样,您的消息将始终显示,无论是否存在异常。它应该看起来更像...

try
  arqTXT.LoadFromFile(LogPath);
except
  on E: EInOutError do begin
    ShowMessage('The log file could not be found. Check if the service is running. Message: '
      + E.Message);
  end
end;

该代码将捕获并处理 I/O 异常。您将使用不同的异常类型而不是 EInOutError 来处理不同类型的异常,或者肮脏的方法是使用 on E: Exception 来捕获所有类型。您还可以使用GetLastError 识别特定错误代码,并进一步识别/记录此错误代码以准确了解问题所在(文件丢失、只读等),假设发生了 I/O 异常。

Here's a good article explaining how to handle exceptions in Delphi.

要指出的另一件事是当您看到异常时。当您处于调试模式(从 IDE 运行应用程序)时,它会默认显示所有异常,即使是在应用程序自行运行时看不到的异常。 You can disable this in the IDE。那篇文章适用于 Delphi 2007,但我很确定它也应该适用于 2010,因为 Delphi XE2 中的选项相同。

【讨论】:

  • @DavidHeffernan 处理异常当然不止这些,但对于看起来是初学者的人来说,我只是想保持简单。我也可以使用MessageDlg 而不是ShowMessage,或者重写整个消息以使其更有意义,或者使用GetLastError 并编写case 语句来处理不同类型的I/O 错误。但是是的,处理特定的异常类型是正确的方法。
  • 好吧,你不能使用 GetLastError 因为你不知道你是否得到了最近调用的 API 函数的错误代码。 Krom 的代码要好得多。
  • 我已经对其进行了修改以强调这一点。我还意识到字符串使用的是 " 而不是 '。
【解决方案3】:

使用解决它

try

exception
on e: exception do
ShowMessage("My Message");

而不是尝试/最终。

【讨论】:

  • 必须给-1,你明白了要点,但没有解释,代码不完整,没有多大意义(第一个exception是干什么用的?)
  • 我猜他的意思是try .. except 构造
  • @Daniel 如果您的问题已通过其他人发布的答案 (Krom) 得到解决,那么您应该接受他们的答案,而不是使用相同的解决方案发布另一个答案。 StackOverflow 希望您接受适当的答案(单击旁边的复选标记)。我也回答的比较详细。
猜你喜欢
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2019-05-18
相关资源
最近更新 更多