Правильная обработка исключений

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Johny
Местный житель
Сообщения: 291
Зарегистрирован: 29 мар 2005, 17:49
Откуда: С-Петербург
Контактная информация:

Правильная обработка исключений

Сообщение Johny »

Пишу вот такой код, чуть ли не весь скопирован из хелпа, но исключение не обрабатывается. Если пишу левое имя файла - все вылетает напрочь.

HadleEvent

cmInit : {
...

_try {
MyDBF:=getfilename('*.dbf','Выберите файл для импорта');
}
_except
on ExPathNotFound : {
message ('Не правильный путь !', mferror);
exit;
_reRaise
}
_except
on ExFileNotFound : {
message ('Файл не найден !', mferror);
exit;
_reRaise
}
_except
on ExFile : {
message (ExploreException, mfError);
_doFinally;
}
...
}
Безвыходных ситуаций не бывает: DO LOOP WHILE TRUE
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Сообщение Darikon »

пост старый , проблема та же :
делаю так

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

  _try             //блок возможных проблем
    {
    mOpen:=DBFOpen(MyFileH,mode);
    }
  _except          //обработка исключений
    on ExFile: 
      {
      LogList_01.Write('ERR',0);
      LogList_01.Write('Файл '+MyFileH+' открыть не удалось по причине: '+ExploreException,mfError);
      FlagErr:=1;
      _Retry;
      }
    else
      {
      Message ('Блок else: ' + ExploreException, mfError);
      }
  _finally {  };   //end _finally

вылетает по рантайму. делал все по хелпам, может что не так описал?
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

я делаю так, нормально отрабатывает и не падает.

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

  handle := dbfopen(path, stOpenRead);
  if handle = 0 then { abort; exit; }
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Сообщение Darikon »

Алексей
данная конструкция у меня тоже работает, но:
если файл в данный момент открыт, или отсутствует, мне необходимо вывести сообщение в лог с ПРИЧИНОЙ незагрузки данных.
К тому же хотелось бы использовать обработку исключений и для работы с базой, но возникает ощущение , что try except НЕ РАБОТАЕТ КАК НАДО.
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Сообщение Darikon »

ведь гораздо проще обработать исключение, чем писать на каждую таблицу проверку на уникальные индексы.
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Сообщение Darikon »

такое ощущение, что обработку исключений вообще никто не использует...
а ведь такая хорошая вещь!
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

я использовал в другом месте давно, но не при открытии ДБФ файлов, работало.
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Сообщение Darikon »

если файл открыт другим пользователем для записи,
fileexist не помогает - файл же существует, и Галактика падает сразу на этой строке

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

mOpen:=DBFOpen(MyFileH,mode); 
выдавая сообщение "Файл недоступен" и RunTime
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Сообщение KATZ »

Darikon писал(а):вылетает по рантайму
Принципиальный вопрос: на каком операторе вылетает?
Интереса ради скомпилировал код, запустил, у меня вообще никакого исключения не возникло. Откуда-то изнутри функции DBFOpen выдается сообщение о невозможности открыть файл и возвращается нулевой дескриптор. Посмотрел документацию, там сказано, что исключения группы ExFile относятся к объекту File. Отсюда следует, что на функцию DBFOpen они могут и не распространяться.
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Сообщение Darikon »

обрамляю DBFOpen операторами Message.
первый выходит, затем появляется сообщение о невозможности доступа к файлу, затем Галактика вылетает по рантайму и второй Message естесственно не обрабатывается.

KATZ
По Вашему мнению, к какой группе тогда отнести данное исключение?
Ведь существует еще else:

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

on ExFile: 
      { 
      LogList_01.Write('ERR',0); 
      LogList_01.Write('Файл '+MyFileH+' открыть не удалось по причине: '+ExploreException,mfError); 
      FlagErr:=1; 
      _Retry; 
      } 
    else 
      { 
      Message ('Блок else: ' + ExploreException, mfError); 
      } 
тогда получается, try except вообще не ловит данный вид исключений???
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Сообщение KATZ »

По Вашему мнению, к какой группе тогда отнести данное исключение?
тогда получается, try except вообще не ловит данный вид исключений???
Я не разработчик, не знаю. Могу лишь предположить, что такая ситуация может вообще не рассматриваться как исключение.
Попробуйте поставить Message сразу после _except, будет ясно, возникает исключение или RunTime происходит внутри DBFOpen. Кстати, чему у вас равен mode (второй параметр DBFOpen)? Может, он имеет значение не из диапазона допустимых?
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Сообщение Darikon »

mode := 15648;
когда файл свободен, все нормально отрабатывает, т.ч. с этим вопросов нет.
попробую позднее открыть файл через

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

      f_var.OpenFile(MyFileH,stOpenRead); // открыть файл
      f_var.ReadLn(MyText);// считать строку
      f_var.Close; // закрыть // конец разбора файла
может, чего покажет..
Попробуйте поставить Message сразу после _except, будет ясно, возникает исключение или RunTime происходит внутри DBFOpen.
уже пробовал, описано выше. первое сообщение выходит, после dbfopen - нет
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Сообщение KATZ »

обрамляю DBFOpen операторами Message
первое сообщение выходит, после dbfopen - нет
Я имел в виду второй вызов Message сделать не внутри _try, а внутри _except. Это бы конкретизировало момент рантайма.
У меня, как ни стараюсь, ни исключений, ни рантаймов добиться не удается. При попытке открыть занятый файл - сообщение о невозможности, и программа продолжается дальше. Напрашивается вывод, что поведение зависит от набора заплат, они у нас почти наверняка разные.
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Сообщение Darikon »

ПОЛУЧИЛОСЬ!!!!
для проверки пришлось использовать:

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

      f_var.OpenFile(MyFileH,stOpenRead); // открыть файл
      f_var.ReadLn(MyText);// считать строку
      f_var.Close; // закрыть // конец разбора файла
предположение KATZ полностью подтвердилось в части того, что
исключения группы ExFile относятся к объекту File. Отсюда следует, что на функцию DBFOpen они могут и не распространяться.

Респект KATZ!!!
ilshat
Местный житель
Сообщения: 222
Зарегистрирован: 04 июн 2008, 14:35
Откуда: Стерлитамак
Контактная информация:

Сообщение ilshat »

Отсюда следует еще один вывод: если вы реализуете основополагающие конструкции языка потрудитесь делать их правильно.
Я так понимаю могут быть еще функции которые не ловятся в try...except. Хотелось тогда чтобы было описание мол так и так эта функция мега-уникальна и не вызывает нормальное исключение, а попытка отловить его вызывает падение.
Ответить