我希望显示自定义错误消息,而不是系统生成的错误消息。具体来说,在这种情况下,如果用户试图打开已经在使用的文件,我想捕获错误并显示我的消息,但系统总是打败我并生成以下消息:" 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;
答案 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块中的代码将直接触发。当引发特定异常时。
编辑:删除了不相关的文字。