powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Гашение исключения в середине цикла
12 сообщений из 12, страница 1 из 1
Гашение исключения в середине цикла
    #39201231
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот запускаю я приложенный скрипт и там есть такой цикл:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  open c;
  while (1=1) do
   begin
     begin
        fetch c into :a;
        if (row_count = 0) then
          leave;
        insert into t1 values (:a);
        suspend;
     when any do begin insert into t1 values (-1); end
     end
   end
  close C;


Где-то в его середине из вызываемой процедуры должно прилететь исключение, погаситься блоком WHEN и (по идее) цикл должен продолжиться пока вложенная процедура не вернёт row_count равный нулю. Однако он прерывается сразу после прихода исключения. Это у меня идея неправильная или в тройке живёт баг?
...
Рейтинг: 0 / 0
Гашение исключения в середине цикла
    #39201343
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если фетч из курсора выкинул ошибку, то даже если мы ее обработали, это никак не значит что фетч был успешным. Поэтому row_count ненулевым стать не может. Отсюда и выход из цикла.
...
Рейтинг: 0 / 0
Гашение исключения в середине цикла
    #39201355
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrдаже если мы ее обработали, это никак не значит что фетч был успешным.
Поэтому row_count ненулевым стать не может.
Это понятно. Непонятно почему IF вообще выполняется на этом цикле. Или почему на следующем
цикле FETCH не возвращает единицу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Гашение исключения в середине цикла
    #39201392
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНепонятно почему IF вообще выполняется на этом цикле.
да, выше я ступил. IF и не должен выполняться, после обработчика управление передается на END. Так что значение ROW_COUNT вообще пофиг, его некому проверять.

Data Definition Guide* Performs the ensuing statement or block of statements specified by the WHEN statement
that handles the exception.
* Returns program control to the block in the procedure following the WHEN statement.
...
Рейтинг: 0 / 0
Гашение исключения в середине цикла
    #39201404
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrIF и не должен выполняться, после обработчика управление передается на END.
Так что значение ROW_COUNT вообще пофиг, его некому проверять.
Подумалось: может, просто курсор автоматически закрывается при любой ошибке и fetch из
закрытого курсора естественно возвращает row_count = 0?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Гашение исключения в середине цикла
    #39201409
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

фетч из закрытого курсора выкинет ошибку
...
Рейтинг: 0 / 0
Гашение исключения в середине цикла
    #39201414
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrIF и не должен выполняться, после обработчика управление передается на END. Так что значение ROW_COUNT вообще пофиг, его некому проверять.Но там же следующая итерация цикла...
...
Рейтинг: 0 / 0
Гашение исключения в середине цикла
    #39201419
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

блин, что-то невнимательный я сегодня :-( Внешний цикл пойдет на очередную итерацию, конечно же.
...
Рейтинг: 0 / 0
Гашение исключения в середине цикла
    #39201420
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrфетч из закрытого курсора выкинет ошибку
Да, значит не закрывает. Может, просто считает что всё выфетчил?..

PS: Выброс ошибки тут загнал бы код в бесконечный цикл.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Гашение исключения в середине цикла
    #39201452
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если ошибка возникла при фетче из процедуры, то процедура закрывается и последующие фетчи из нее возвращают EOF. При этом курсор-обертка об этом понятия не имеет, поэтому исключение не выкидывает. Эта логика торчит как минимум со времен IB6.
...
Рейтинг: 0 / 0
Гашение исключения в середине цикла
    #39201458
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
собственно, если процедура что-то выкинула до своего SUSPEND, то повторный фетч из нее может снова выполнить этот же глючный код. Таким способом хотели избежать зацикливания, видимо. А то, что хитрый Сибиряков делает преинкремент и кидает исключения сугубо условно - не предусмотрели.
...
Рейтинг: 0 / 0
Гашение исключения в середине цикла
    #39201472
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrА то, что хитрый Сибиряков делает преинкремент и кидает исключения сугубо
условно - не предусмотрели.
Ну, это только подтверждает, что не быть мне тестером, а баг, который я печёнкой чую -
либо не существует в природе, либо на такую жалкую приманку не выползет. В таком случае
мне нечего добавить к своим пулл-реквестам по 5173 и 5174.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Гашение исключения в середине цикла
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]