Как избежать ошибок во время выполнения - PullRequest
1 голос
/ 08 мая 2011

У меня много команд в одной процедуре, и есть эта команда:

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

Вся процедура создана для отправки файла из TClientSocket в TServerSocket.

Процедура запускаетсякаждые 100 миллисекунд от таймера.Конечно, иногда у меня появляется ошибка EFCreateError, потому что файл используется.

Все работает хорошо, потому что некоторые данные получены.Но как не показать эту ошибку?

Ответы [ 4 ]

2 голосов
/ 08 мая 2011

Вам необходимо зафиксировать ошибку и обработать ее. Смотрите код ниже.

....
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 будет установлена ​​на ноль.
В следующем коде вы можете протестировать Stream <> nil или Assigned(Stream) (что совпадает) и делать что-то с потоком, если все хорошо.

1 голос
/ 08 мая 2011

Почему бы вам не обернуть доступ к файлу в мьютекс или блокировку чтения / записи?Тогда вам не нужно полагаться на такой хрупкий подход, как этот.

Звучит так, будто вы опрашиваете файл как механизм межпроцессного взаимодействия.Что-то вроде трубы, вероятно, будет намного эффективнее.

1 голос
/ 08 мая 2011

Мне кажется, я понимаю, что вы имеете в виду ...

Вы правильно обрабатываете исключения, но хотите избежать появления всплывающего окна Delphi IDE для каждого возникающего исключения.

Если это так, выполните следующие действия:

  1. Перейти в Инструменты -> Параметры отладчика
  2. Перейти на вкладку «Исключения языка»
  3. Добавить EFCreateError в список исключений, чтобы игнорировать
0 голосов
/ 08 мая 2011

Использование 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
...