Форум » [x]Harbour » Как перехватить data width error » Ответить
Как перехватить data width error
Pasha: делаю так: #include "error.ch" func main Local bErr dbCreate('tt', {{'NN', 'N', 2, 0}}) use tt new bErr := ErrorBlock({|oE| if(oE:GenCode==EG_DATAWIDTH, 0, Break(oE))}) begin sequence dbAppend() Field->NN := 999 recover end ErrorBlock(bErr) retu nil Выскакивает unrecoverable error 9001, причем в обоих харборах Я что-то делаю не так, или это глюк, который надо фиксить ?
Ответов - 14
Pasha: Кстати, если в xHarbour использовать try/catch, то ошибка перехватывается. А в Harbour try/catch нет, и begin sequence глючит
Andrey: А я всегда мучился с такой ошибкой ! Так и не придумал как от нее избавиться.
Петр: Выскакивает unrecoverable error 9001, причем в обоих харборах Точно так же, как и Clipper А в Harbour try/catch нет, и begin sequence глючит В Harbour это будет выглядеть как .. begin sequence with bErr ..
Pasha: До меня уже дошло, как надо делать bErr := ErrorBlock({|oE| if(oE:GenCode==EG_DATAWIDTH, .F., Break(oE))}) .F. - чтобы пропустить присваивание, которое вызвало переполнение
Петр: цитата: А в Harbour try/catch нет, и begin sequence глючит В Harbour это будет выглядеть как .. begin sequence with bErr .. Эмуляция try/catch в Harbour #include "error.ch" func main Local oErr dbCreate('tt', {{'NN', 'N', 2, 0}}) use tt new begin sequence with {|e| Break(e) } dbAppend() Field->NN := 999 recover using oErr ? oErr:description //.... end retu nil Обращаю внимание, что вызывать ErrorBlock(..)при использовании begin sequence with не нужно Pasha пишет: bErr := ErrorBlock({|oE| if(oE:GenCode==EG_DATAWIDTH, .F., Break(oE))}) Pasha, зачем вам нужен вызов Break(oE), если вы recover using не используете?
Pasha: Да мне никаких действий по recover делать не надо. Надо игнорировать эту ошибку.
Дигидроген монооксид: А если возникнет ошибка не data_width_error и об этом будет умолчено? долго будете искать концы. надо всегда перехватывать только интересующие ошибки, а остальные пусть крашат программу.
AndreyZh: Господа! Данную ошибку и способы исправления активно обсуждал в "своих" темах... Ларчик открывается элементарно: dbCreate('tt', {{'NN', 'N', 2, 0}}) // Создали структуру use tt new // Открыли таблицу // А перейти на неё ЗАБЫЛИ, а (x)Harbour Ваши хотелки не понимает, в отличии от Клиппер. Нужно добавить SELE TT // И далее по тексту begin sequence with {|e| Break(e) } dbAppend()
AlexMyr: Вот проверил на харборе: func main() dbCreate('uu', {{'NN', 'N', 2, 0}}) // Создали структуру use uu new ?"alias=",alias() // возвращает UU dbCreate('tt', {{'NN', 'N', 2, 0}}) // Создали структуру use tt new // Открыли таблицу ?"alias=",alias() // возвращает TT return nil AndreyZh пишет: // А перейти на неё ЗАБЫЛИ, а (x)Harbour Ваши хотелки не понимает, в отличии от Клиппер. Нужно добавить Про какие хотелки Вы говорите?
AndreyZh: Про какие хотелки Вы говорите? dbCreate('uu', {{'NN', 'N', 2, 0}}) // Создали структуру use uu new ?"alias=",alias() // возвращает UU Что бы наверняка породить ошибку попробуйте после use uu new создать индекс или открыть таблицу с индексом и сделать SEEK? Лично мне из-за этого пришлось слишком много перепахивать в программе... Хотя часть операций/функций с таблицей не порождает ошибок.
AlexMyr: Пример: func main() dbCreate('uu', {{'NN', 'N', 2, 0}}) // Создали структуру use uu new index on NN to uu ?"dbSeek(22)=",dbSeek(22) ?"alias=",alias() ?"ordBagName=",ordBagName() ?"indexord=",indexord() dbCreate('tt', {{'NN', 'N', 2, 0}}) // Создали структуру use tt new // Открыли таблицу index on NN to tt ?"dbSeek(99)=",dbSeek(99) ?"alias=",alias() ?"ordBagName=",ordBagName() ?"indexord=",indexord() return nil Результат: dbSeek(22)= .F. alias= UU ordBagName= uu indexord= 1 dbSeek(99)= .F. alias= TT ordBagName= tt indexord= 1
AlexMyr: И еще такой пример: func main() dbCreate('uu', {{'NN', 'N', 2, 0}}) // Создали структуру use uu new index on NN to uu ?"dbSeek(22)=",dbSeek(22) ?"alias=",alias() ?"ordBagName=",ordBagName() ?"indexord=",indexord() dbCreate('tt', {{'NN', 'N', 2, 0}}) // Создали структуру use tt new // Открыли таблицу index on NN to tt ?"dbSeek(99)=",dbSeek(99) ?"alias=",alias() ?"ordBagName=",ordBagName() ?"indexord=",indexord() dbcloseall() use uu ?"alias=",alias() use tt new // Открыли таблицу //index on NN to tt set index to tt ?"dbSeek(99)=",dbSeek(99) ?"alias=",alias() ?"ordBagName=",ordBagName() ?"indexord=",indexord() return nil Результат: dbSeek(22)= .F. alias= UU ordBagName= uu indexord= 1 dbSeek(99)= .F. alias= TT ordBagName= tt indexord= 1 alias= UU dbSeek(99)= .F. alias= TT ordBagName= tt indexord= 1 Или дайте свой пример где вылазит ошибка.
AndreyZh: AlexMyr пишет: Или дайте свой пример где вылазит ошибка Уважаемый AlexMyr! При всём желании НЕ БУДУ ломать переписанной огромным трудом с ловлей многочисленных "особенностей" xHarbour ПО! Допускаю, что разработчики уже устранили некоторые проблемы и у Вас свежая сборка. Если интересно, то в темах http://clipper.borda.ru/?1-3-0-00000137-000-0-0-1277829057 и http://clipper.borda.ru/?1-4-60-00000527-000-0-0-1270323717 уважаемое сообщество помогало мне в нахождении "клопов" и их исправлении, в том числе по ошибке 9001.
Vlad04: use uu ?"alias=",alias() use tt new // Открыли таблицу Я всегда пишу перед окрытием Select 0
полная версия страницы