Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Гашение исключения в середине цикла / 12 сообщений из 12, страница 1 из 1
26.03.2016, 19:47
    #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
27.03.2016, 10:12
    #39201343
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гашение исключения в середине цикла
если фетч из курсора выкинул ошибку, то даже если мы ее обработали, это никак не значит что фетч был успешным. Поэтому row_count ненулевым стать не может. Отсюда и выход из цикла.
...
Рейтинг: 0 / 0
27.03.2016, 12:14
    #39201355
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гашение исключения в середине цикла
dimitrдаже если мы ее обработали, это никак не значит что фетч был успешным.
Поэтому row_count ненулевым стать не может.
Это понятно. Непонятно почему IF вообще выполняется на этом цикле. Или почему на следующем
цикле FETCH не возвращает единицу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.03.2016, 13:56
    #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
27.03.2016, 14:30
    #39201404
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гашение исключения в середине цикла
dimitrIF и не должен выполняться, после обработчика управление передается на END.
Так что значение ROW_COUNT вообще пофиг, его некому проверять.
Подумалось: может, просто курсор автоматически закрывается при любой ошибке и fetch из
закрытого курсора естественно возвращает row_count = 0?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.03.2016, 14:42
    #39201409
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гашение исключения в середине цикла
Dimitry Sibiryakov,

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

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

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


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