Форум » [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



полная версия страницы