Страница 1 из 2

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

Добавлено: 11 янв 2005, 13:20
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;
}
...
}

Добавлено: 03 мар 2009, 10:19
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

вылетает по рантайму. делал все по хелпам, может что не так описал?

Добавлено: 03 мар 2009, 10:30
Алексей
я делаю так, нормально отрабатывает и не падает.

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

  handle := dbfopen(path, stOpenRead);
  if handle = 0 then { abort; exit; }

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

Добавлено: 03 мар 2009, 10:48
Darikon
ведь гораздо проще обработать исключение, чем писать на каждую таблицу проверку на уникальные индексы.

Добавлено: 03 мар 2009, 11:17
Darikon
такое ощущение, что обработку исключений вообще никто не использует...
а ведь такая хорошая вещь!

Добавлено: 03 мар 2009, 11:30
Алексей
я использовал в другом месте давно, но не при открытии ДБФ файлов, работало.

Добавлено: 03 мар 2009, 12:28
Darikon
если файл открыт другим пользователем для записи,
fileexist не помогает - файл же существует, и Галактика падает сразу на этой строке

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

mOpen:=DBFOpen(MyFileH,mode); 
выдавая сообщение "Файл недоступен" и RunTime

Добавлено: 03 мар 2009, 12:34
KATZ
Darikon писал(а):вылетает по рантайму
Принципиальный вопрос: на каком операторе вылетает?
Интереса ради скомпилировал код, запустил, у меня вообще никакого исключения не возникло. Откуда-то изнутри функции DBFOpen выдается сообщение о невозможности открыть файл и возвращается нулевой дескриптор. Посмотрел документацию, там сказано, что исключения группы ExFile относятся к объекту File. Отсюда следует, что на функцию DBFOpen они могут и не распространяться.

Добавлено: 03 мар 2009, 12:41
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 вообще не ловит данный вид исключений???

Добавлено: 03 мар 2009, 12:55
KATZ
По Вашему мнению, к какой группе тогда отнести данное исключение?
тогда получается, try except вообще не ловит данный вид исключений???
Я не разработчик, не знаю. Могу лишь предположить, что такая ситуация может вообще не рассматриваться как исключение.
Попробуйте поставить Message сразу после _except, будет ясно, возникает исключение или RunTime происходит внутри DBFOpen. Кстати, чему у вас равен mode (второй параметр DBFOpen)? Может, он имеет значение не из диапазона допустимых?

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

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

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

Добавлено: 03 мар 2009, 16:30
KATZ
обрамляю DBFOpen операторами Message
первое сообщение выходит, после dbfopen - нет
Я имел в виду второй вызов Message сделать не внутри _try, а внутри _except. Это бы конкретизировало момент рантайма.
У меня, как ни стараюсь, ни исключений, ни рантаймов добиться не удается. При попытке открыть занятый файл - сообщение о невозможности, и программа продолжается дальше. Напрашивается вывод, что поведение зависит от набора заплат, они у нас почти наверняка разные.

Добавлено: 03 мар 2009, 17:07
Darikon
ПОЛУЧИЛОСЬ!!!!
для проверки пришлось использовать:

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

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

Респект KATZ!!!

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