Как поймать номерок исключения Exeption на клиенте?
Как поймать номерок исключения Exeption на клиенте?
Подскажите пожалуйста!
У меня есть исключение exeption, которое запихнуто в тригер, т.е. верификация данных, не могу удалить текущую запись, пока образец данной записи есть в другой таблице. Как на клиенте с помощью компонета ApplicationEvents выловить номерок этого exeption и скажем выдать свое сообщение после этого или еще какие-нибудь действия сделать после этого. Или как это вообще правильно делается?
У меня есть исключение exeption, которое запихнуто в тригер, т.е. верификация данных, не могу удалить текущую запись, пока образец данной записи есть в другой таблице. Как на клиенте с помощью компонета ApplicationEvents выловить номерок этого exeption и скажем выдать свое сообщение после этого или еще какие-нибудь действия сделать после этого. Или как это вообще правильно делается?
у меня в триггере ничего не удаляется. у меня в тригере exeption. У меня на текущую табличку повешен тригер, что текущую запись удалить не льзя, пока есть дубликат этой записи в другой таблице (связь по внешним ключам). Если дубликат текущей записи есть и в другой таблице, то формируется исключение - выдается сообщение, что текущую запись удалить не льзя, пока из другой таблицы не будут удалены все похожие дубликаты. Вот именно номер это исключение я теперь хочу поймать на клиенте и обработать его по-своемуMerlin писал(а):А девушка про реляционную модель, нормальные формы, reference integrity, foreign keys и видимость версий записей транзакциями с различными уровнями изоляции что-нить слышала? Это к вопросу о проверке допустимости удаления в триггере вообще.
? если есть связь по FK то никакие триггеры не нужны.У меня на текущую табличку повешен тригер, что текущую запись удалить не льзя, пока есть дубликат этой записи в другой таблице (связь по внешним ключам)
такое впечатление, что Вы занимаетесь теоретическим программированием - строите FK, триггеры, пишете exception, а потом представляете себе как это будет работать.Вот именно номер это исключение я теперь хочу поймать на клиенте и обработать его по-своему
Не проще-ли ПРОВЕРИТЬ прямо сразу? Например, есть exception в триггере - тогда ловим exception ВООБЩЕ в Application.OnException, и в отладчике наблюдаем отловленный класс со всеми его свойствами, номерами ошибок и т.п.
Или, создаем две таблицы, создаем FK, добавляем записи и пытаемся удалить в подчиненной. смотрим на exception.
И т.д.
Re: Как поймать номерок исключения Exeption на клиенте?
может, я конечно не совсем понял, что надо ...Марина писал(а): выловить номерок этого exeption
Код: Выделить всё
//общая для проверки ошибок
procedure TdmBase.Check_SRV_Error(E:EFIBError);
var
FLog:TextFile;
S_log:string;
begin
case E.IBErrorCode of
335544569:MessageDlg('Ошибка выполнения!', mtError, [mbOk], 0);
335544345:MessageDlg('Запись занята другим пользователем!', mtError, [mbOk], 0);
335544665:MessageDlg('Запись с таким кодом уже есть!', mtError, [mbOk], 0);
335544347:MessageDlg('Вы не заполнили обязательные для занесения данные', mtError, [mbOk], 0);
335544466:MessageDlg('Нет соответствующей записи в головной таблице!', mtError, [mbOk], 0);
335544349:MessageDlg('Запись с таким кодом уже есть!', mtError, [mbOk], 0);
else
MessageDlg('Необрабатываемая ошибка! '+IntTostr(E.IBErrorCode), mtError, [mbOk], 0);
end;
try
if not FileExists('Err.log') then
begin
AssignFile(FLog,'Err.log');
ReWrite(FLog);
end
else
begin
AssignFile(FLog,'Err.log');
Append(FLog);
end;
s_log:=DateTimeToStr(Now)+' ';
//s_log:=s_log+Form1.USER_Name+' ';
s_log:=s_log+E.ClassName+': '+E.IBMessage+' Код: '+IntTostr(E.IBErrorCode);
Writeln(Flog,s_log);
CloseFile(Flog);
except
//
end;
end
забыл сразу вставить:
Код: Выделить всё
function TdmBase.on_Save_DSet(DSet:TpFIBDataSet):integer;
begin
try
result:=0;
if not(DSet.UpdateTransaction.Active) then DSet.UpdateTransaction.StartTransaction;
DSet.Post;
DSet.UpdateTransaction.Commit;
except
on E:EFIBInterBaseError do
begin
Check_SRV_Error(E);
DSet.Cancel;
DSet.UpdateTransaction.Rollback;
result:=-1;
end;
end;
end;
Последний раз редактировалось stix-s 07 окт 2006, 11:22, всего редактировалось 1 раз.
Короче говоря кинула сейчас себе на формочку компонентик ApplicationEvents, у него есть св-во Tag, в нем пишется номер exeption - номер исключения, кот я ловлю. а далее в обработчике TRY и EXCEPT он обрабатывается. Так сейчас попробовала вроде пашет, т.е. допустим могу выдать длинное сообщение на это исключение уже с клиента. Но правильно ли так будет? Может можно обойтись без компонента ApplicationEvents или еще как-нибудь это сделать? А прикол то всей затеи в том, что если попробовать удалить ткущую запись в IBExpert, то выведется исключение и удаления не произойдет. Так то наверно оно правильнее, т.е самое кривое приложение в таком случае не запорит всей задумки.
Re: Как поймать номерок исключения Exeption на клиенте?
о только сейчас увидила код, после того, как свое сообщение добавила. Интересно.... Спасибочки
централизация обработки чего-то в приложении иногда полезна, а иногда вредна. так что это опционально.Но правильно ли так будет?
и зачем тогда триггер? триггеры обычно для контроля целостности не используются.А прикол то всей затеи в том, что если попробовать удалить ткущую запись в IBExpert, то выведется исключение и удаления не произойдет.
Re: Как поймать номерок исключения Exeption на клиенте?
Код: Выделить всё
procedure TdmBase.Check_SRV_Error(E:EFIBError);
а у меня сегодня выяснилось, что с компонентом ApplicationEvents ничего не работает, рано обрадовалась, толком ничего не посмотрев ((((((
И как в отладчике OnExeption наблюдаем отловленный класс со всеми его свойствами и номерами ошибок? Мне очень код нужен плизНапример, есть exception в триггере - тогда ловим exception ВООБЩЕ в Application.OnException, и в отладчике наблюдаем отловленный класс со всеми его свойствами, номерами ошибок и т.п.
девушка, купите же книжку какую-нибудь по программированию в дельфях.И как в отладчике OnExeption наблюдаем отловленный класс со всеми его свойствами и номерами ошибок?
Вы не можете у проекта выключить оптимизацию при компиляции, а в Application.OnException написать что-то вроде
var s: string;
s:=e.Message;
и на нем поставить breakpoint? А при попадании на breakpoint скастовать E к TIBError или как его там?
или, в конце концов написать
try
ваше действие с БД
except
on e: Exception do
if e is TIBError then
...
???
это же элементарные вещи, которые надо знать ДО работы с базами данных. и которые к БД никакого отношения не имеют.
Re: Как поймать номерок исключения Exeption на клиенте?
не компонент сиё метод формыМарина писал(а):procedure TdmBase.Check_SRV_Error(E:EFIBError);
а это где такое взять? компонент что ли какой-то специальный, где его взять такой?
procedure Check_SRV_Error(E:EFIBError);
TdmBase = class(TDataModule)
при работе с БД в
try
...
except
......
end;
Отлавливается исключение типа EFIBError (Компоненты FIB+) на клиенте и производятся необходимые действия.
Последний раз редактировалось stix-s 09 окт 2006, 14:01, всего редактировалось 1 раз.
ну и что что не имеют! подумаешь! имеют, не имеют..... у меня не было такого, в первый раз, как в первый класс, не знаю, поэтому и спрашиваю! конечно, когда все знаешь, все просто! Думаете легко мне тут сидеть лепить подобное! и вообще я студент. И в моей книжке тоже нет такого... конечно вам то конечно хорошо! у вас значит есть, а у меня нет!девушка, купите же книжку какую-нибудь по программированию в дельфях.
это же элементарные вещи, которые надо знать ДО работы с базами данных. и которые к БД никакого отношения не имеют.
собственно, здесь не бесплатные курсы. цель форума несколько иная.и вообще я студент.
не верю, что в книжке по дельфи нет примеров обработки exception. Даже если попалась такая книжка, примеры есть как в хелпе, так и на диске (demos/db/dberror/*.* - dm1.pas).И в моей книжке тоже нет такого... конечно вам то конечно хорошо! у вас значит есть, а у меня нет!
Может кто-нибудь подсказать, я этот пример содрала из книги, но номер ошибки, глобального исключения - значение ErrCode почему то равно нулю..... Может знает кто-нибудь как этот номер вытащить или ошибку увидит в коде. Т.е. здесь ошибка выводится глобальным обработчиком под номером ноль.
код ловли своих exception убит модератором.
вам не свои exception надо обрабатывать, а приходящие с сервера. примеры в достаточном количестве тут привели.
Код: Выделить всё
interface
//Новый класс исключения (EExceptionCode)
вам не свои exception надо обрабатывать, а приходящие с сервера. примеры в достаточном количестве тут привели.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Слушь...ну ты вообще ДЯТЕЛ!!! Ну ты вообще угарный хлопец!!! Я же писала, что это не мой код! Ты читать умеешь? Этот код с КНИГИ!!! Буква в букву и он не работает, этот код писала НЕ Я!!! В нем номер ошибки получается не правильный! ХАМЛО!!! И я твоего мнения кажется не спрашивала! Тебе не кажется, что у тебя мнение о себе через край! .... Если у тебя какие-то проблемы с твоими бабами, то это не значит, что всех других надо теперь чмырить и ОБИЖАТЬ!!!! Ты вроде админ, можешь после этого меня со своего сайта гребаного вообще удалить! В инете найду себе правильный код по-лучше, если тут некоторые (не будем показывать пальцем) не могут подбросить, а могут только пальцы гнуть и других товарищей ОБИЖАТЬ!!! Это кстати, говорит, о плохом воспитании! Хотя ты тут не один такой в своем роде... надо было логиниться не под бабским именем.... Жалко, что на тебя вживую посмотреть не льзя! Очень интересно... такое мнение о себе.... Слушай а тебе сколько лет? Лет 16-17 наверно.....Dimitry Sibiryakov писал(а):Дэвушка, какой придурок учил вас программировать? Найдите его и посоветуйте убиться ап стенку.