Правильная обработка исключений
Модераторы: m0p3e, edward_K, Модераторы
-
- Местный житель
- Сообщения: 291
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: С-Петербург
- Контактная информация:
Правильная обработка исключений
Пишу вот такой код, чуть ли не весь скопирован из хелпа, но исключение не обрабатывается. Если пишу левое имя файла - все вылетает напрочь.
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;
}
...
}
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
-
- Постоянный обитатель
- Сообщения: 188
- Зарегистрирован: 17 июн 2008, 17:07
- Откуда: Москва
- Контактная информация:
пост старый , проблема та же :
делаю так
вылетает по рантайму. делал все по хелпам, может что не так описал?
делаю так
Код: Выделить всё
_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
вылетает по рантайму. делал все по хелпам, может что не так описал?
-
- Местный житель
- Сообщения: 2898
- Зарегистрирован: 24 июн 2005, 12:12
- Откуда: Иркутская область
я делаю так, нормально отрабатывает и не падает.
Код: Выделить всё
handle := dbfopen(path, stOpenRead);
if handle = 0 then { abort; exit; }
-
- Постоянный обитатель
- Сообщения: 188
- Зарегистрирован: 17 июн 2008, 17:07
- Откуда: Москва
- Контактная информация:
Алексей
данная конструкция у меня тоже работает, но:
если файл в данный момент открыт, или отсутствует, мне необходимо вывести сообщение в лог с ПРИЧИНОЙ незагрузки данных.
К тому же хотелось бы использовать обработку исключений и для работы с базой, но возникает ощущение , что try except НЕ РАБОТАЕТ КАК НАДО.
данная конструкция у меня тоже работает, но:
если файл в данный момент открыт, или отсутствует, мне необходимо вывести сообщение в лог с ПРИЧИНОЙ незагрузки данных.
К тому же хотелось бы использовать обработку исключений и для работы с базой, но возникает ощущение , что try except НЕ РАБОТАЕТ КАК НАДО.
-
- Постоянный обитатель
- Сообщения: 188
- Зарегистрирован: 17 июн 2008, 17:07
- Откуда: Москва
- Контактная информация:
если файл открыт другим пользователем для записи,
fileexist не помогает - файл же существует, и Галактика падает сразу на этой строке
выдавая сообщение "Файл недоступен" и RunTime
fileexist не помогает - файл же существует, и Галактика падает сразу на этой строке
Код: Выделить всё
mOpen:=DBFOpen(MyFileH,mode);
Принципиальный вопрос: на каком операторе вылетает?Darikon писал(а):вылетает по рантайму
Интереса ради скомпилировал код, запустил, у меня вообще никакого исключения не возникло. Откуда-то изнутри функции DBFOpen выдается сообщение о невозможности открыть файл и возвращается нулевой дескриптор. Посмотрел документацию, там сказано, что исключения группы ExFile относятся к объекту File. Отсюда следует, что на функцию DBFOpen они могут и не распространяться.
-
- Постоянный обитатель
- Сообщения: 188
- Зарегистрирован: 17 июн 2008, 17:07
- Откуда: Москва
- Контактная информация:
обрамляю DBFOpen операторами Message.
первый выходит, затем появляется сообщение о невозможности доступа к файлу, затем Галактика вылетает по рантайму и второй Message естесственно не обрабатывается.
KATZ
По Вашему мнению, к какой группе тогда отнести данное исключение?
Ведь существует еще else:
тогда получается, try except вообще не ловит данный вид исключений???
первый выходит, затем появляется сообщение о невозможности доступа к файлу, затем Галактика вылетает по рантайму и второй 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 вообще не ловит данный вид исключений???
Попробуйте поставить Message сразу после _except, будет ясно, возникает исключение или RunTime происходит внутри DBFOpen. Кстати, чему у вас равен mode (второй параметр DBFOpen)? Может, он имеет значение не из диапазона допустимых?
-
- Постоянный обитатель
- Сообщения: 188
- Зарегистрирован: 17 июн 2008, 17:07
- Откуда: Москва
- Контактная информация:
mode := 15648;
когда файл свободен, все нормально отрабатывает, т.ч. с этим вопросов нет.
попробую позднее открыть файл через
может, чего покажет..
когда файл свободен, все нормально отрабатывает, т.ч. с этим вопросов нет.
попробую позднее открыть файл через
Код: Выделить всё
f_var.OpenFile(MyFileH,stOpenRead); // открыть файл
f_var.ReadLn(MyText);// считать строку
f_var.Close; // закрыть // конец разбора файла
уже пробовал, описано выше. первое сообщение выходит, после dbfopen - нетПопробуйте поставить Message сразу после _except, будет ясно, возникает исключение или RunTime происходит внутри DBFOpen.
обрамляю DBFOpen операторами Message
Я имел в виду второй вызов Message сделать не внутри _try, а внутри _except. Это бы конкретизировало момент рантайма.первое сообщение выходит, после dbfopen - нет
У меня, как ни стараюсь, ни исключений, ни рантаймов добиться не удается. При попытке открыть занятый файл - сообщение о невозможности, и программа продолжается дальше. Напрашивается вывод, что поведение зависит от набора заплат, они у нас почти наверняка разные.
-
- Постоянный обитатель
- Сообщения: 188
- Зарегистрирован: 17 июн 2008, 17:07
- Откуда: Москва
- Контактная информация:
ПОЛУЧИЛОСЬ!!!!
для проверки пришлось использовать:
предположение KATZ полностью подтвердилось в части того, что
Респект KATZ!!!
для проверки пришлось использовать:
Код: Выделить всё
f_var.OpenFile(MyFileH,stOpenRead); // открыть файл
f_var.ReadLn(MyText);// считать строку
f_var.Close; // закрыть // конец разбора файла
исключения группы ExFile относятся к объекту File. Отсюда следует, что на функцию DBFOpen они могут и не распространяться.
Респект KATZ!!!
-
- Местный житель
- Сообщения: 222
- Зарегистрирован: 04 июн 2008, 14:35
- Откуда: Стерлитамак
- Контактная информация:
Отсюда следует еще один вывод: если вы реализуете основополагающие конструкции языка потрудитесь делать их правильно.
Я так понимаю могут быть еще функции которые не ловятся в try...except. Хотелось тогда чтобы было описание мол так и так эта функция мега-уникальна и не вызывает нормальное исключение, а попытка отловить его вызывает падение.
Я так понимаю могут быть еще функции которые не ловятся в try...except. Хотелось тогда чтобы было описание мол так и так эта функция мега-уникальна и не вызывает нормальное исключение, а попытка отловить его вызывает падение.