Страница 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 не помогает - файл же существует, и Галактика падает сразу на этой строке
выдавая сообщение "Файл недоступен" и 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. Хотелось тогда чтобы было описание мол так и так эта функция мега-уникальна и не вызывает нормальное исключение, а попытка отловить его вызывает падение.