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

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

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

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

Сообщение SlowPow » 07.12.2022 04:38:13

Есть код вот такого вида:
Код: Выделить всё
try
  AssignFile(f, filename);
  Reset(f);
  ReadLn(f, filename);
  CloseFile(f);
except
  err := true;
end;

Раз в несколько секунд он читает данные из файла. Но иногда файл оказывается занят другой программой, от чего моя выдаёт сообщение, что, мол, файл недоступен, "Ок", "Abort".
В параметрах есть пункт "Исключения языка". Однако, он глобален, то есть исключения нельзя отключить в релиз версии, но включить в дебаг. Хочется, чтобы try не позволял пользователю видеть всякий хлам, который я сам обрабатываю в коде.
Как подавить вывод подобной фигни?
Аватара пользователя
SlowPow
незнакомец
 
Сообщения: 4
Зарегистрирован: 27.09.2022 05:39:57

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

Сообщение Awkward » 07.12.2022 06:36:46

А старый добрый метод с ключиком {$I-} и проверкой IOResult после Reset уже не работает?
Awkward
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2017 00:06:47

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

Сообщение SlowPow » 07.12.2022 06:58:06

Блин, я совсем забыл про $I-
Спасибо.
Аватара пользователя
SlowPow
незнакомец
 
Сообщения: 4
Зарегистрирован: 27.09.2022 05:39:57

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

Сообщение svk12 » 07.12.2022 15:17:58

Для подавления сообщений применяю пустой блок обработки исключения:
Код: Выделить всё
try
....
except on E:Exception do
  begin
  end;
end;
svk12
постоялец
 
Сообщения: 407
Зарегистрирован: 09.06.2008 18:42:47

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

Сообщение iskander » 07.12.2022 18:44:27

Насколько я понимаю, сама возможность работы с исключениями в настоящее время неразрывно связана с модулем 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.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение SlowPow » 08.12.2022 06:25:18

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

Это, пожалуй, тоже хорошее решение:
Код: Выделить всё
try
....
except on E:Exception do
  begin
  end;
end;
Аватара пользователя
SlowPow
незнакомец
 
Сообщения: 4
Зарегистрирован: 27.09.2022 05:39:57


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36

Рейтинг@Mail.ru