Страница 1 из 2
Как поймать номерок исключения Exeption на клиенте?
Добавлено: 06 окт 2006, 13:41
Марина
Подскажите пожалуйста!
У меня есть исключение exeption, которое запихнуто в тригер, т.е. верификация данных, не могу удалить текущую запись, пока образец данной записи есть в другой таблице. Как на клиенте с помощью компонета ApplicationEvents выловить номерок этого exeption и скажем выдать свое сообщение после этого или еще какие-нибудь действия сделать после этого. Или как это вообще правильно делается?
Добавлено: 06 окт 2006, 13:49
Merlin
А девушка про реляционную модель, нормальные формы, reference integrity, foreign keys и видимость версий записей транзакциями с различными уровнями изоляции что-нить слышала? Это к вопросу о проверке допустимости удаления в триггере вообще.
Добавлено: 06 окт 2006, 15:29
kdv
Как на клиенте с помощью компонета ApplicationEvents выловить номерок этого exeption
отловить этот exception в OnException или в блоке try/except. что за компонент ApplicationEvents - не знаю.
Добавлено: 06 окт 2006, 15:47
Марина
Merlin писал(а):А девушка про реляционную модель, нормальные формы, reference integrity, foreign keys и видимость версий записей транзакциями с различными уровнями изоляции что-нить слышала? Это к вопросу о проверке допустимости удаления в триггере вообще.
у меня в триггере ничего не удаляется. у меня в тригере exeption. У меня на текущую табличку повешен тригер, что текущую запись удалить не льзя, пока есть дубликат этой записи в другой таблице (связь по внешним ключам). Если дубликат текущей записи есть и в другой таблице, то формируется исключение - выдается сообщение, что текущую запись удалить не льзя, пока из другой таблицы не будут удалены все похожие дубликаты. Вот именно номер это исключение я теперь хочу поймать на клиенте и обработать его по-своему

Добавлено: 06 окт 2006, 15:53
kdv
У меня на текущую табличку повешен тригер, что текущую запись удалить не льзя, пока есть дубликат этой записи в другой таблице (связь по внешним ключам)
? если есть связь по FK то никакие триггеры не нужны.
Вот именно номер это исключение я теперь хочу поймать на клиенте и обработать его по-своему
такое впечатление, что Вы занимаетесь теоретическим программированием - строите FK, триггеры, пишете exception, а потом представляете себе как это будет работать.
Не проще-ли ПРОВЕРИТЬ прямо сразу? Например, есть exception в триггере - тогда ловим exception ВООБЩЕ в Application.OnException, и в отладчике наблюдаем отловленный класс со всеми его свойствами, номерами ошибок и т.п.
Или, создаем две таблицы, создаем FK, добавляем записи и пытаемся удалить в подчиненной. смотрим на exception.
И т.д.
Re: Как поймать номерок исключения Exeption на клиенте?
Добавлено: 06 окт 2006, 16:15
stix-s
Марина писал(а):
выловить номерок этого 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;
Добавлено: 06 окт 2006, 16:19
Марина
Короче говоря кинула сейчас себе на формочку компонентик ApplicationEvents, у него есть св-во Tag, в нем пишется номер exeption - номер исключения, кот я ловлю. а далее в обработчике TRY и EXCEPT он обрабатывается. Так сейчас попробовала вроде пашет, т.е. допустим могу выдать длинное сообщение на это исключение уже с клиента. Но правильно ли так будет? Может можно обойтись без компонента ApplicationEvents или еще как-нибудь это сделать?

А прикол то всей затеи в том, что если попробовать удалить ткущую запись в IBExpert, то выведется исключение и удаления не произойдет. Так то наверно оно правильнее, т.е самое кривое приложение в таком случае не запорит всей задумки.
Re: Как поймать номерок исключения Exeption на клиенте?
Добавлено: 06 окт 2006, 16:23
Марина
о только сейчас увидила код, после того, как свое сообщение добавила. Интересно.... Спасибочки

Добавлено: 06 окт 2006, 16:29
kdv
Но правильно ли так будет?
централизация обработки чего-то в приложении иногда полезна, а иногда вредна. так что это опционально.
А прикол то всей затеи в том, что если попробовать удалить ткущую запись в IBExpert, то выведется исключение и удаления не произойдет.
и зачем тогда триггер? триггеры обычно для контроля целостности не используются.
Re: Как поймать номерок исключения Exeption на клиенте?
Добавлено: 09 окт 2006, 11:22
Марина
Код: Выделить всё
procedure TdmBase.Check_SRV_Error(E:EFIBError);
а это где такое взять? компонент что ли какой-то специальный, где его взять такой?
а у меня сегодня выяснилось, что с компонентом ApplicationEvents ничего не работает, рано обрадовалась, толком ничего не посмотрев ((((((
Добавлено: 09 окт 2006, 11:30
Марина
Например, есть exception в триггере - тогда ловим exception ВООБЩЕ в Application.OnException, и в отладчике наблюдаем отловленный класс со всеми его свойствами, номерами ошибок и т.п.
И как в отладчике OnExeption наблюдаем отловленный класс со всеми его свойствами и номерами ошибок? Мне очень код нужен

плиз
Добавлено: 09 окт 2006, 12:30
kdv
И как в отладчике OnExeption наблюдаем отловленный класс со всеми его свойствами и номерами ошибок?
девушка, купите же книжку какую-нибудь по программированию в дельфях.
Вы не можете у проекта выключить оптимизацию при компиляции, а в Application.OnException написать что-то вроде
var s: string;
s:=e.Message;
и на нем поставить breakpoint? А при попадании на breakpoint скастовать E к TIBError или как его там?
или, в конце концов написать
try
ваше действие с БД
except
on e: Exception do
if e is TIBError then
...
???
это же элементарные вещи, которые надо знать ДО работы с базами данных. и которые к БД никакого отношения не имеют.
Добавлено: 09 окт 2006, 12:34
kdv
на всякий случай добавлю, что у человека FIBPlus, а не IBX, поэтому вам надо искать те имена классов exception, какую вы библиотеку используете.
Re: Как поймать номерок исключения Exeption на клиенте?
Добавлено: 09 окт 2006, 12:37
stix-s
Марина писал(а):procedure TdmBase.Check_SRV_Error(E:EFIBError);
а это где такое взять? компонент что ли какой-то специальный, где его взять такой?
не компонент сиё

метод формы
procedure Check_SRV_Error(E:EFIBError);
TdmBase = class(TDataModule)
при работе с БД в
try
...
except
......
end;
Отлавливается исключение типа EFIBError (Компоненты FIB+) на клиенте и производятся необходимые действия.
Добавлено: 09 окт 2006, 12:53
Марина
девушка, купите же книжку какую-нибудь по программированию в дельфях.
это же элементарные вещи, которые надо знать ДО работы с базами данных. и которые к БД никакого отношения не имеют.
ну и что что не имеют! подумаешь! имеют, не имеют..... у меня не было такого, в первый раз, как в первый класс, не знаю, поэтому и спрашиваю! конечно, когда все знаешь, все просто! Думаете легко мне тут сидеть лепить подобное! и вообще я студент. И в моей книжке тоже нет такого... конечно вам то конечно хорошо! у вас значит есть, а у меня нет!

Добавлено: 09 окт 2006, 13:52
kdv
и вообще я студент.
собственно, здесь не бесплатные курсы. цель форума несколько иная.
И в моей книжке тоже нет такого... конечно вам то конечно хорошо! у вас значит есть, а у меня нет!
не верю, что в книжке по дельфи нет примеров обработки exception. Даже если попалась такая книжка, примеры есть как в хелпе, так и на диске (demos/db/dberror/*.* - dm1.pas).
Добавлено: 11 окт 2006, 15:30
Марина
Может кто-нибудь подсказать, я этот пример содрала из книги, но номер ошибки, глобального исключения - значение ErrCode почему то равно нулю..... Может знает кто-нибудь как этот номер вытащить или ошибку увидит в коде. Т.е. здесь ошибка выводится глобальным обработчиком под номером ноль.
Код: Выделить всё
interface
//Новый класс исключения (EExceptionCode)
код ловли своих exception убит модератором.
вам не свои exception надо обрабатывать, а приходящие с сервера. примеры в достаточном количестве тут привели.
Добавлено: 11 окт 2006, 15:49
Dimitry Sibiryakov
Дэвушка, какой придурок учил вас программировать? Найдите его и посоветуйте убиться ап стенку.
Жестко приводить неизвестный класс к своему собственному это, знаете ли, чревато боком. Отчего вы начали этот ужас вместо простой ловли того исключения, которое кидают ваши любимые компоненты доступа?
Добавлено: 12 окт 2006, 11:25
Марина
Dimitry Sibiryakov писал(а):Дэвушка, какой придурок учил вас программировать? Найдите его и посоветуйте убиться ап стенку.
Слушь...ну ты вообще ДЯТЕЛ!!! Ну ты вообще угарный хлопец!!! Я же писала, что это не мой код! Ты читать умеешь? Этот код с КНИГИ!!! Буква в букву и он не работает, этот код писала НЕ Я!!! В нем номер ошибки получается не правильный! ХАМЛО!!! И я твоего мнения кажется не спрашивала! Тебе не кажется, что у тебя мнение о себе через край! .... Если у тебя какие-то проблемы с твоими бабами, то это не значит, что всех других надо теперь чмырить и ОБИЖАТЬ!!!! Ты вроде админ, можешь после этого меня со своего сайта гребаного вообще удалить! В инете найду себе правильный код по-лучше, если тут некоторые (не будем показывать пальцем) не могут подбросить, а могут только пальцы гнуть и других товарищей ОБИЖАТЬ!!! Это кстати, говорит, о плохом воспитании! Хотя ты тут не один такой в своем роде... надо было логиниться не под бабским именем.... Жалко, что на тебя вживую посмотреть не льзя! Очень интересно... такое мнение о себе.... Слушай а тебе сколько лет? Лет 16-17 наверно.....
Добавлено: 12 окт 2006, 11:27
Марина
Кто действительно пытался помощь - огромное спасибо! Приятно в критическую минуту встретить соотечественника!