Exception в триггере

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Ответить
Narat
Сообщения: 5
Зарегистрирован: 21 сен 2005, 12:54

Exception в триггере

Сообщение Narat » 21 сен 2005, 13:53

Как быть - при возбуждении EXCEPTION в триггере клиентом это воспринимается как "User Abort" (при возбуждении исключения в процедуре все нормально - возвращает номер исключения и нужное сообщение). Использую IBX Delphi 7, FireBird 1.0.3 сборка 972. Как добиться того, чтобы клиент получал номер exception и его сообщение?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 сен 2005, 16:17

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

Narat
Сообщения: 5
Зарегистрирован: 21 сен 2005, 12:54

Сообщение Narat » 28 сен 2005, 14:32

kdv писал(а):при вызове exception на сервере клиент всегда получает одно и то же, независимо откуда exception был вызван.
Тогда почему IBX воспринимает это по-разному ? Может, проблема в настройках IBX?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 29 сен 2005, 10:37

я не знаю, как и чего он по разному воспринимает, потому что всегда видел только именно пользовательский exception. У вас в программе где-то сидит обработка, которая мешает нормальному виду.
Сделайте try except и словите exception. Посмотрите на него в отладчике.

Narat
Сообщения: 5
Зарегистрирован: 21 сен 2005, 12:54

Сообщение Narat » 30 сен 2005, 15:54

kdv писал(а):...Сделайте try except и словите exception. Посмотрите на него в отладчике.
Процедуры на выполнение я запускаю в базе через IBQuеry - в этом случае проблем нет - при возникновении Exception в процедуре я получаю его в клиенте в нормальном виде.

К таблицам я обращаюсь тоже через IBQuery, но с использованием IBUpdateSQL (кэширование изменений). Exception в триггере возникает (имеется ввиду, что если я его сам возбуждаю в триггере после проверки каких-то условий) при вызове ApplyUpdates компонента IBQuery - этот Exception я действительно ловлю в try ... except - но вижу только "User Abort" - как если бы я сам вызывал дельфийскую функцию Abort. Далее в части except я соответственно вызываю CancelUpdates компонента IBQuery - как и надо.

Причем, я это пробовал и отдельно от моего проекта на "пустом" проекте - с минимумом кода и компонентов, чтобы исключить какую-либо скрытую обработку (в реальном проекте много чего наворочено). Получил то же - "User Abort"... Попробуйте сами...

Такие вот пранблемы....
Последний раз редактировалось Narat 30 сен 2005, 16:41, всего редактировалось 1 раз.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 30 сен 2005, 16:18

я так понимаю, ошибку перехватывает CachedUpdates. Оно тебе и правда надо? Просто раньше без него в BDE комбинацию Query+UpdateSQL использовать было нельзя, а в IBX - не обязательно. Проще, кстати, IBDataSet использовать вместо IBQuery+IBUpdateSQL.

Narat
Сообщения: 5
Зарегистрирован: 21 сен 2005, 12:54

Сообщение Narat » 30 сен 2005, 16:45

Причем, я это пробовал и отдельно от моего проекта на "пустом" проекте - с минимумом кода и компонентов, чтобы исключить какую-либо скрытую обработку (в реальном проекте много чего наворочено). Получил то же - "User Abort"... Попробуйте сами...

Короче, как я понял, надо использовать IBDataSet. Спасибо за помощь...

Narat
Сообщения: 5
Зарегистрирован: 21 сен 2005, 12:54

Сообщение Narat » 30 сен 2005, 17:25

Narat писал(а):Короче, как я понял, надо использовать IBDataSet. Спасибо за помощь...
Действительно - IBDataSet корректно ловит Exception из триггера - УРА! Хвала Всевышнему! СПАСИБО за помощь

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 30 сен 2005, 17:26

CachedUpdates можно использовать независимо от компонент IBX. Вопрос в том, кто именно при applyUpdates жрет твой exception. я утверждаю что CU. Ты мне пытаешься доказать (?) обратное.

Собственно, найти достаточно легко. ApplyUpdates это метод IBCustomDataSet. Если его вызвать без включения CU - ты получишь ошибку (ibxeNotCachedUpdates). Соответственно все дальнейшее читается в коде этого метода,

Код: Выделить всё

case UpdateAction of
          uaFail:
            IBError(ibxeUserAbort, [nil]);
ibxeUserAbort - это и есть тот самый sUserAbort = 'User Abort';

причем, если CU при ApplyUpdates не будет само обрабатывать ошибки с сервера, то тогда оно не сможет понять, что ПАКЕТ обновлений, отправленный на сервер, прошел неуспешно.

Где тут было "копать" вообще, а ? :) "Проблема" находится за 2 минуты. Кроме того, надо было тебе сразу читать про CU, а то ты меня своим триггером запутал. :)

Ответить