Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ? / 12 сообщений из 12, страница 1 из 1
27.06.2014, 21:49
    #38682372
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
hi all

Как известно из доки: http://www.firebirdsql.org/refdocs/langrefupd15-psql-exception.html
Rethrowing a caught exception

Within the exception handling block only , you can rethrow the caught exception or error by giving the EXCEPTION command without any arguments. Outside such blocks, this “bare” command has no effect.

Поэтому вот такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
create or alter procedure px as begin end;
commit;
recreate exception ex_bad_rows_found 'ex_bad_rows_found';
commit;

recreate table td(id int); commit;
recreate table tlog(dts timestamp default 'now', msg varchar(30) ); commit;

set term ^;
create or alter procedure px as
  declare v_id int;
begin
  select id from td rows 1 into v_id;
  if ( v_id is not null  ) then
  begin
    in autonomous transaction do
      insert into tlog(msg) values('found rows in td, id='||:v_id);

    --#######
    exception; -- вместо правильного: exception  ex_bad_rows_found ;
    --#######

  end
end
^set term ;^
commit;
insert into td values(1);
commit;

- не выкинет исключения при таком вызове:

Код: plaintext
1.
2.
3.
execute block as
begin
  execute procedure px;
end

(т.е. просто втихаря запишет в таблицу tlog).

Получается, что если забыть указать имя исключения, то вся логика летит к ЧМ.
Зачем так было сделано ? Какой смысл допускать команду, которая вроде бы говорит "хальт!", а на самом деле ничего не делает ?
...
Рейтинг: 0 / 0
27.06.2014, 22:03
    #38682386
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
Таблоид> Получается, что если забыть указать имя исключения, то вся логика летит к ЧМ.

Какая логика? По-моему, всё правильно отработано.

> Зачем так было сделано ?

Скорее всего трудно/невозможно/поленились сделать проверку
наличия/нахождения внутри блока обработки ошибок. А что?

> Какой смысл допускать команду, которая вроде бы
> говорит "хальт!", а на самом деле ничего не делает ?

Ну NOP тебя тоже возмущает или что именно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.06.2014, 22:13
    #38682394
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
Гаджимурадов РустамТаблоид> Получается, что если забыть указать имя исключения, то вся логика летит к ЧМ.

Какая логика? По-моему, всё правильно отработано."Как же это так, кормилец ?!" (С)

Почему ты считаешь, что "всё правильно", ведь если указать имя эксепшена (т.е. "exception ex_bad_rows_found ;"), то выполняемый код действительно вылетит нахрен - а мне нужно было именно это! Тогда как при случайно пропущенном имени этого эксепшена будет дальше работать...
Просто зарегистрит там ошибку (в автономке) и НИЧЕГО не выдаст "на гор а "!

Гаджимурадов Рустам> Зачем так было сделано ?

Скорее всего трудно/невозможно/поленились сделать проверку
наличия/нахождения внутри блока обработки ошибок. А что?Ну, я налетал на эту хрень уже, месяца 2-3 взад, но вот забыл, блин! И сидел три часа пялился, понять не мог :-)

Гаджимурадов Рустам> Какой смысл допускать команду, которая вроде бы
> говорит "хальт!", а на самом деле ничего не делает ?

Ну NOP тебя тоже возмущает или что именно?NOP - он сам за себя честно говорит: "я - NOP, не делаю нихрена".
А тут: "я - эксепшен (хоть и без имени... ну и что, подумаешь ?)! И обязательно прерву твою программу!" - а на самом деле ничего не делает.

Чуешь разницу ? :-)
...
Рейтинг: 0 / 0
27.06.2014, 22:30
    #38682404
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
Таблоид> Почему ты считаешь, что "всё правильно"

Потому работает так как задокументировано и так как
ожидается, если не логично, то точно не нелогично.

> вылетит нахрен - а мне нужно было именно это!

Если тебе нужно, чтобы вылетело нахрен - пиши
как именно нахрен должо вылететь. Логично?

> при случайно пропущенном имени этого эксепшена будет дальше работать...

У меня в голове логика "случайного пропущения
имени эксепшена" не укладывается. Если я хочу
выдать ошибку нахрен - я указываю какую, если
я хочу создать таблицу нахрен - указываю имя,
поля и т.д. Случайностей тут нет.

Я готов с тобой согласиться, что лучше было бы
не молчать при компиляции таких PSQL-блоков,
а выдавать dynamic/compile error - но с этим тебе
в трекер, не сюда.

> Ну, я налетал на эту хрень уже, месяца 2-3 взад, но вот забыл, блин!

Бывает, чего уж там. В отпуск сходи, лето,
море, нервы подлечи, зрение, внимание.
Я вроде несколько раз рассказывал, как мы
вдвоём минут 10 перепутанные параметры
Pos не замечали. После забытых Next-ов я
после "While Not Eof" автоматически сразу
пишу "Next End" - рефлекторно.

То же самое с while и inc/dec в EB - первое
время тоже забывал, а там это похуже, чем
на клиенте. Тебя это, кстати, не бесит, нет?
Тоже ведь "случайно забыл, блин!" :-)

> Чуешь разницу ? :-)

Нет. Я разницу не чую, а читаю. Доку. :)
Вот к примеру какую ошибку он должен
выкинуть? -104, UnknownNahrenError?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.06.2014, 22:45
    #38682416
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
Гаджимурадов Рустам> вылетит нахрен - а мне нужно было именно это!

Если тебе нужно, чтобы вылетело нахрен - пиши
как именно нахрен должо вылететь. Логично?
Если я ловлю чрезвычайно трудную ошибку, создавая всякие там отладочные процедурки-"ловушки", которые долдны кое-что проверять и тут же выкидывать при обнаружении трабла, то за каким псом мне говорить "как именно" вылетело - ведь на клиенте будет видно стек вызовов, с точностью до строки + столба!
А сейчас приходится:
1) не забыть создать эксепшен, который будет не нужен после этого;
2) прошерстить весь код: а вдруг где-то еще (вовне when-блока) забыл воткнуть имя этого эксепшена ?

Гаджимурадов РустамНет. Я разницу не чую, а читаю. Доку. :)
Вот к примеру какую ошибку он должен
выкинуть? -104, UnknownNahrenError? Всю доку в башке не удержишь, сколько не читай.
Стоило месяц не создавать процедуры, и вот - напоролся

ИМХО, хоть какое-то предупреждение компилер мог бы выдавать.
Или IBExpert (он ведь много умеет: например, про select * from tratata страшилку говорит, или про неюзаемые переменные, etc)
...
Рейтинг: 0 / 0
27.06.2014, 23:35
    #38682443
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
Таблоид> ведь на клиенте ...

... не будет видно ни кода, ни текста ошибки.

> А сейчас приходится:
> 1) не забыть создать эксепшен, который будет не нужен после этого;

Так не создавай его. Кидай любой доступный.

> 2) прошерстить весь код: а вдруг где-то еще (вовне when-блока) забыл воткнуть имя этого эксепшена ?

Неправильно. Правильно - везде втыкать имя эксепшена,
делая по необходимости исключение для when-блока.

> Или IBExpert

Саша тут недалеко, рядом. Попроси у него.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.06.2014, 23:38
    #38682445
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
ТаблоидА тут: "я - эксепшен (хоть и без имени... ну и что, подумаешь ?)! И обязательно прерву твою программу!" - а на самом деле ничего не делает.
эта команда всего-навсего заново выбрасывает ранее пойманное исключение. Не было поймано исключение - ничего не генерит. Никаких "обязательно прерву" - это ты сам додумал.
...
Рейтинг: 0 / 0
27.06.2014, 23:43
    #38682447
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
dimitrэта команда всего-навсего заново выбрасывает ранее пойманное исключение. Не было поймано исключение - ничего не генерит. Никаких "обязательно прерву" - это ты сам додумал.Она ведь может его выбросить только в случае, когда сама находится в when-блоке, нет разве ?

В большом коде трудно найти такую засаду. Даже пустые when any do begin end - и то проще.
В общем, http://tracker.firebirdsql.org/browse/CORE-4474 - и пусть меня дальше там побьют, но истина дороже.
...
Рейтинг: 0 / 0
27.06.2014, 23:51
    #38682455
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
Гаджимурадов РустамТаблоид> ведь на клиенте ...

... не будет видно ни кода, ни текста ошибки.
Ну как это "не будет", когда во:
Код: plaintext
1.
2.
3.
EX_BAD_ROWS_FOUND.
ex_bad_rows_found.
At procedure 'PX' line: 12, col: 5.

(но это при указании имени эксепшена, ес-но).

Гаджимурадов Рустам> А сейчас приходится:
> 1) не забыть создать эксепшен, который будет не нужен после этого;

Так не создавай его. Кидай любой доступный.Зачем притягивать за уши "любой доступный", когда они все у мну со "своим строгим смыслом" ? С толку сбивать будет такой мессаг.

Гаджимурадов Рустам> 2) прошерстить весь код: а вдруг где-то еще (вовне when-блока) забыл воткнуть имя этого эксепшена ?

Неправильно. Правильно - везде втыкать имя эксепшена ,
делая по необходимости исключение для when-блока.Когда непременно надо добавлять что-то необязательное в данной ситуации (я про отладочные процедурки, которые нужны только пока идёт поиск бага) - то также непременно про это забудешь. Это человечий фактор, чтоб его...
Забыл воткнуть имя, находясь в куске кода *до* when-блока - получи гемор на весь день (если не вспомнишь вовремя, что так нельзя делать).

Гаджимурадов Рустам> Или IBExpert

Саша тут недалеко, рядом. Попроси у него.Спрошу, конечно, но он недавно мораторий на все хотелки объявил.
...
Рейтинг: 0 / 0
28.06.2014, 00:58
    #38682473
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
Таблоид> Ну как это "не будет", когда во

Вот так это не будет, без никаких "во".
Читай внимательнее, что тебе пишут,
а не что ты пишешь и хочешь видеть.

> они все у мну со "своим строгим смыслом" ?

Нагло врёшь. Если у тебя все со своим строгим
смыслом, значит, ты и в конкретном случае
хочешь "свой со строгим смыслом". Какой?

> Когда непременно надо добавлять что-то необязательное ...
> то также непременно про это забудешь.

Ничего подобного, и отладочные процедурки тут
не при чём. Тут привычка и культура кодирования.
Я ж тебе привёл пример - цикл while легко становится
бесконечным если забыть или неправильно написать
любое из трёх его условий. Тебя это не бесит, нет?

> Спрошу, конечно, но он недавно мораторий на все хотелки объявил.

А чего так, времени нет или релиз большой готовит?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.06.2014, 01:01
    #38682475
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
ТаблоидГР> Правильно - везде втыкать имя эксепшена,
ГР> делая по необходимости исключение для when-блока.

Когда непременно надо добавлять что-то необязательное в данной ситуации
(я про отладочные процедурки, которые нужны только пока идёт поиск бага)
Кстати, тут ты тоже мягко говоря зарапортовался, ибо конкретно
в "отладочных процедурах" сабж практически не нужен, там можно
тупо в каждом случае бросать эксепшен, как я и сказал выше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.06.2014, 16:55
    #38682638
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ?
Гаджимурадов Рустам> они все у мну со "своим строгим смыслом" ?

Нагло врёшь. Если у тебя все со своим строгим
смыслом, значит, ты и в конкретном случае
хочешь "свой со строгим смыслом". Какой?
У мну в коде где-то есть трудно уловимая бага, проявляется только при большом числе коннектов. Приводит к отрицательным остаткам по кол-ву. В коде стоит ловушка: как только лезет check на отрицат. кол-во - немедленно всё прекращается и выбрасывается "дамп" грязных данных некоторых таблиц.
Ну так вот: бьюсь третий день, найти - не могу. Тогда решил поставить побольше ловушек, чтобы они раньше срабатывали.
Мне в данном случае пофигу, какая именно из них сработала, т.к. isql при эксепшене выдаёт стек вызовов и найти соотв место - дело 5 секунд.
Так что тут действительно нет резона добавлять имя исключению, ибо оно - просто для отладки, временное. Ловушка, короче.

Гаджимурадов РустамЯ ж тебе привёл пример - цикл while легко становится
бесконечным если забыть или неправильно написать
любое из трёх его условий. Тебя это не бесит, нет?
Ну так while, как и NOP, говорит сам за себя: "я - цЫкл! могу идти до Второго пришествия, проверь меня!".
Я на самом деле не врубаюсь в следующее: зачем допускать неименованный exception вне when-блока, если он ведёт себя как NOP, т.е. просто дезинформирует того, кто не знает или забыл про эту "мегафичу".

Гаджимурадов Рустам> Спрошу, конечно, но он недавно мораторий на все хотелки объявил.

А чего так, времени нет или релиз большой готовит?Ну, ему надо в ИБЭ много чего допиливать в связи с изменениями, которые уже есть и еще будут. А тут мы лезем со своими хотелками... :-)
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Безымянный (случайно :)) exception ВНЕ when блока допускается компилятором. Зачем ? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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