try{} не подавляет вывод ошибки

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
SlowPow
незнакомец
Сообщения: 4
Зарегистрирован: 27.09.2022 04:39:57

try{} не подавляет вывод ошибки

Сообщение SlowPow »

Есть код вот такого вида:

Код: Выделить всё

try
  AssignFile(f, filename);
  Reset(f);
  ReadLn(f, filename);
  CloseFile(f);
except
  err := true;
end; 
Раз в несколько секунд он читает данные из файла. Но иногда файл оказывается занят другой программой, от чего моя выдаёт сообщение, что, мол, файл недоступен, "Ок", "Abort".
В параметрах есть пункт "Исключения языка". Однако, он глобален, то есть исключения нельзя отключить в релиз версии, но включить в дебаг. Хочется, чтобы try не позволял пользователю видеть всякий хлам, который я сам обрабатываю в коде.
Как подавить вывод подобной фигни?
Awkward
новенький
Сообщения: 53
Зарегистрирован: 18.01.2017 23:06:47

Сообщение Awkward »

А старый добрый метод с ключиком {$I-} и проверкой IOResult после Reset уже не работает?
Аватара пользователя
SlowPow
незнакомец
Сообщения: 4
Зарегистрирован: 27.09.2022 04:39:57

Сообщение SlowPow »

Блин, я совсем забыл про $I-
Спасибо.
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

Для подавления сообщений применяю пустой блок обработки исключения:

Код: Выделить всё

try
....
except on E:Exception do
  begin
  end;
end;
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Насколько я понимаю, сама возможность работы с исключениями в настоящее время неразрывно связана с модулем SysUtils, то есть вот эта программа

Код: Выделить всё

program test;

{$mode objfpc}{$h+}

uses SysUtils;

procedure Proc;
var
  MyFile: Text;
  s: string;
begin
  Assign(MyFile, 'some.txt');
  try
    Reset(MyFile);
    try
      ReadLn(MyFile, s);
    finally
      Close(MyFile);
    end;
  except
    WriteLn('No such file.');
  end;
end;

begin
  Proc;
  ReadLn;
end.
напечатает "No such file.", но если закомментировать uses SysUtils, то грохнется с RTE 2.
Аватара пользователя
SlowPow
незнакомец
Сообщения: 4
Зарегистрирован: 27.09.2022 04:39:57

Сообщение SlowPow »

Прикол был не в том, что RTE крашила программу, а просто выскакивал месседж, с кнопкам ОК и Аборт. Чтобы продолжить приходилось жать ОК. Программа работает круглосуточно и молча, но раз в несколько суток "замирает" в момент вывода сообщения, пока не нажмёшь ОК. И это было неприятно...
PS: Посмотрел свой код - действительно не использовался SysUtils. Надо другие программы пересмотреть, потому что SysUtils я редко использую, но try раньше никогда не подводил и молча ловил ошибки.

Это, пожалуй, тоже хорошее решение:

Код: Выделить всё

try
....
except on E:Exception do
  begin
  end;
end;
Ответить