在运行时避免错误

时间:2011-05-08 12:14:38

标签: delphi error-handling delphi-7

我在一个程序中有很多命令,并且有这个命令:

...
Stream:=TFileStream.Create(FileName,fmOpenread);
...

创建整个过程以将文件从TClientSocket发送到TServerSocket。

该过程每隔100毫秒从Timer启动一次。当然,有时我会显示EFCreateError错误,因为该文件已被使用。

一切都运行良好,因为收到了一些数据。但是如何避免显示此错误?

4 个答案:

答案 0 :(得分:2)

您需要捕获错误并进行处理。 请参阅下面的代码。

....
try
  Stream:=TFileStream.Create(FileName,fmOpenread); 
except on E: EFCreateError do
  Stream:= nil;
end; {try}
if Stream <> nil then try
  //rest of your procedure
finally  
  Stream.Free; //make sure your stream is freed.
end;

如果此处出现错误,则运行时不会显示任何消息,在调试中您会看到错误,但您可以忽略该错误。
如果出错,Stream变量将设置为nil 在下面的代码中,您可以测试Stream <> nilAssigned(Stream) (这是相同的),如果一切正常,请对流进行处理。

答案 1 :(得分:1)

我想我明白你的意思......

您确实正确处理了异常,但是您希望避免发生每个异常的Delphi IDE弹出窗口。

如果是,请执行以下操作:

  1. 转到工具 - &gt;调试器选项
  2. 转到“语言例外”标签
  3. 将EFCreateError添加到要忽略的例外列表

答案 2 :(得分:1)

为什么不用互斥锁或读/写锁来包含对文件的访问?那么你就不需要依赖这样一种脆弱的方法了。

这听起来像是将文件轮询为进程间通信机制。管道之类的东西可能更有效。

答案 3 :(得分:-2)

使用try ... finally清理并尝试...除了吞下预期的异常:

  Stream := nil; // if it is an unitialized local variable, assign nil
  try
    try
      Stream := TFileStream.Create(Filename, fmOpenread);
    except         
      on E: EFCreateError do
      begin
        // exception thrown if the file is in use
        // and may be ignored in this function
      end;
    end;
  finally
    Stream.Free;
  end