Как поймать номерок исключения Exeption на клиенте?

Запросы, планы, оптимизация запросов, ...

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

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Как поймать номерок исключения Exeption на клиенте?

Сообщение Марина » 06 окт 2006, 13:41

Подскажите пожалуйста!
У меня есть исключение exeption, которое запихнуто в тригер, т.е. верификация данных, не могу удалить текущую запись, пока образец данной записи есть в другой таблице. Как на клиенте с помощью компонета ApplicationEvents выловить номерок этого exeption и скажем выдать свое сообщение после этого или еще какие-нибудь действия сделать после этого. Или как это вообще правильно делается?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 06 окт 2006, 13:49

А девушка про реляционную модель, нормальные формы, reference integrity, foreign keys и видимость версий записей транзакциями с различными уровнями изоляции что-нить слышала? Это к вопросу о проверке допустимости удаления в триггере вообще.

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

Сообщение kdv » 06 окт 2006, 15:29

Как на клиенте с помощью компонета ApplicationEvents выловить номерок этого exeption
отловить этот exception в OnException или в блоке try/except. что за компонент ApplicationEvents - не знаю.

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 06 окт 2006, 15:47

Merlin писал(а):А девушка про реляционную модель, нормальные формы, reference integrity, foreign keys и видимость версий записей транзакциями с различными уровнями изоляции что-нить слышала? Это к вопросу о проверке допустимости удаления в триггере вообще.
у меня в триггере ничего не удаляется. у меня в тригере exeption. У меня на текущую табличку повешен тригер, что текущую запись удалить не льзя, пока есть дубликат этой записи в другой таблице (связь по внешним ключам). Если дубликат текущей записи есть и в другой таблице, то формируется исключение - выдается сообщение, что текущую запись удалить не льзя, пока из другой таблицы не будут удалены все похожие дубликаты. Вот именно номер это исключение я теперь хочу поймать на клиенте и обработать его по-своему :?

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

Сообщение kdv » 06 окт 2006, 15:53

У меня на текущую табличку повешен тригер, что текущую запись удалить не льзя, пока есть дубликат этой записи в другой таблице (связь по внешним ключам)
? если есть связь по FK то никакие триггеры не нужны.
Вот именно номер это исключение я теперь хочу поймать на клиенте и обработать его по-своему
такое впечатление, что Вы занимаетесь теоретическим программированием - строите FK, триггеры, пишете exception, а потом представляете себе как это будет работать.
Не проще-ли ПРОВЕРИТЬ прямо сразу? Например, есть exception в триггере - тогда ловим exception ВООБЩЕ в Application.OnException, и в отладчике наблюдаем отловленный класс со всеми его свойствами, номерами ошибок и т.п.
Или, создаем две таблицы, создаем FK, добавляем записи и пытаемся удалить в подчиненной. смотрим на exception.
И т.д.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Re: Как поймать номерок исключения Exeption на клиенте?

Сообщение stix-s » 06 окт 2006, 16:15

Марина писал(а): выловить номерок этого 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 раз.

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 06 окт 2006, 16:19

Короче говоря кинула сейчас себе на формочку компонентик ApplicationEvents, у него есть св-во Tag, в нем пишется номер exeption - номер исключения, кот я ловлю. а далее в обработчике TRY и EXCEPT он обрабатывается. Так сейчас попробовала вроде пашет, т.е. допустим могу выдать длинное сообщение на это исключение уже с клиента. Но правильно ли так будет? Может можно обойтись без компонента ApplicationEvents или еще как-нибудь это сделать? :shock: А прикол то всей затеи в том, что если попробовать удалить ткущую запись в IBExpert, то выведется исключение и удаления не произойдет. Так то наверно оно правильнее, т.е самое кривое приложение в таком случае не запорит всей задумки.

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Re: Как поймать номерок исключения Exeption на клиенте?

Сообщение Марина » 06 окт 2006, 16:23

о только сейчас увидила код, после того, как свое сообщение добавила. Интересно.... Спасибочки :D

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

Сообщение kdv » 06 окт 2006, 16:29

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

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Re: Как поймать номерок исключения Exeption на клиенте?

Сообщение Марина » 09 окт 2006, 11:22

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

procedure TdmBase.Check_SRV_Error(E:EFIBError); 
а это где такое взять? компонент что ли какой-то специальный, где его взять такой?

а у меня сегодня выяснилось, что с компонентом ApplicationEvents ничего не работает, рано обрадовалась, толком ничего не посмотрев ((((((

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 09 окт 2006, 11:30

Например, есть exception в триггере - тогда ловим exception ВООБЩЕ в Application.OnException, и в отладчике наблюдаем отловленный класс со всеми его свойствами, номерами ошибок и т.п.
И как в отладчике OnExeption наблюдаем отловленный класс со всеми его свойствами и номерами ошибок? Мне очень код нужен :shock: плиз

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

Сообщение kdv » 09 окт 2006, 12:30

И как в отладчике OnExeption наблюдаем отловленный класс со всеми его свойствами и номерами ошибок?
девушка, купите же книжку какую-нибудь по программированию в дельфях.
Вы не можете у проекта выключить оптимизацию при компиляции, а в Application.OnException написать что-то вроде

var s: string;

s:=e.Message;

и на нем поставить breakpoint? А при попадании на breakpoint скастовать E к TIBError или как его там?

или, в конце концов написать
try
ваше действие с БД
except
on e: Exception do
if e is TIBError then
...

???

это же элементарные вещи, которые надо знать ДО работы с базами данных. и которые к БД никакого отношения не имеют.

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

Сообщение kdv » 09 окт 2006, 12:34

на всякий случай добавлю, что у человека FIBPlus, а не IBX, поэтому вам надо искать те имена классов exception, какую вы библиотеку используете.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Re: Как поймать номерок исключения Exeption на клиенте?

Сообщение stix-s » 09 окт 2006, 12:37

Марина писал(а):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 раз.

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 09 окт 2006, 12:53

девушка, купите же книжку какую-нибудь по программированию в дельфях.

это же элементарные вещи, которые надо знать ДО работы с базами данных. и которые к БД никакого отношения не имеют.
ну и что что не имеют! подумаешь! имеют, не имеют..... у меня не было такого, в первый раз, как в первый класс, не знаю, поэтому и спрашиваю! конечно, когда все знаешь, все просто! Думаете легко мне тут сидеть лепить подобное! и вообще я студент. И в моей книжке тоже нет такого... конечно вам то конечно хорошо! у вас значит есть, а у меня нет! :cry: :cry: :cry:

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

Сообщение kdv » 09 окт 2006, 13:52

и вообще я студент.
собственно, здесь не бесплатные курсы. цель форума несколько иная.
И в моей книжке тоже нет такого... конечно вам то конечно хорошо! у вас значит есть, а у меня нет!
не верю, что в книжке по дельфи нет примеров обработки exception. Даже если попалась такая книжка, примеры есть как в хелпе, так и на диске (demos/db/dberror/*.* - dm1.pas).

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 11 окт 2006, 15:30

Может кто-нибудь подсказать, я этот пример содрала из книги, но номер ошибки, глобального исключения - значение ErrCode почему то равно нулю..... Может знает кто-нибудь как этот номер вытащить или ошибку увидит в коде. Т.е. здесь ошибка выводится глобальным обработчиком под номером ноль.

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

interface
//Новый класс исключения (EExceptionCode)
код ловли своих exception убит модератором.
вам не свои exception надо обрабатывать, а приходящие с сервера. примеры в достаточном количестве тут привели.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 11 окт 2006, 15:49

Дэвушка, какой придурок учил вас программировать? Найдите его и посоветуйте убиться ап стенку.
Жестко приводить неизвестный класс к своему собственному это, знаете ли, чревато боком. Отчего вы начали этот ужас вместо простой ловли того исключения, которое кидают ваши любимые компоненты доступа?

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 12 окт 2006, 11:25

Dimitry Sibiryakov писал(а):Дэвушка, какой придурок учил вас программировать? Найдите его и посоветуйте убиться ап стенку.
Слушь...ну ты вообще ДЯТЕЛ!!! Ну ты вообще угарный хлопец!!! Я же писала, что это не мой код! Ты читать умеешь? Этот код с КНИГИ!!! Буква в букву и он не работает, этот код писала НЕ Я!!! В нем номер ошибки получается не правильный! ХАМЛО!!! И я твоего мнения кажется не спрашивала! Тебе не кажется, что у тебя мнение о себе через край! .... Если у тебя какие-то проблемы с твоими бабами, то это не значит, что всех других надо теперь чмырить и ОБИЖАТЬ!!!! Ты вроде админ, можешь после этого меня со своего сайта гребаного вообще удалить! В инете найду себе правильный код по-лучше, если тут некоторые (не будем показывать пальцем) не могут подбросить, а могут только пальцы гнуть и других товарищей ОБИЖАТЬ!!! Это кстати, говорит, о плохом воспитании! Хотя ты тут не один такой в своем роде... надо было логиниться не под бабским именем.... Жалко, что на тебя вживую посмотреть не льзя! Очень интересно... такое мнение о себе.... Слушай а тебе сколько лет? Лет 16-17 наверно.....

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 12 окт 2006, 11:27

Кто действительно пытался помощь - огромное спасибо! Приятно в критическую минуту встретить соотечественника!

Ответить