Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Замена сообщений в стандартных Exceptions [IB6.x]


Страницы:   1 2

Andrey ©   (2003-01-14 17:55:00) 

Собственно это и есть вопрос.

Можно ли вместо стандартного сообщения в Exception (допустим возникающем при нарушении foreign key или primary key не суть важно) выдавать свое сообщение.

Тоесть есть таблица:

create table aa
(ifld integer not null primary key);
insert into aa (ifld) values (1);


При попытке сделать
insert into aa (ifld) values (1);
справедливо вываливается сообщение о нарушении некоего constraint-а. Вот это сообщение и хотелось бы писать по русски, а не по буржуйски.

Единственный способ что я нашел это фактически дублировать работу constraint-а в триггере. Это естественно плохой выход значительно замедляющий работу.


Andrey   (2003-01-20 13:46:00) [1]

>Alexandr
Эх, батенька... Клиентура у нас разная :)

У меня (нашей организации) клиенты ЖЕК-и, и районные администрации восновном. Какой уж тут Интернет, хоть бы простенькая сетка иногда работала и то хорошо :))


Alexandr   (2003-01-20 13:30:00) [2]

я же писал: автоматически программисту отсылать сообщение об ошибке. А потом так же автоматически скачивать патч :)


Andrey   (2003-01-20 13:19:00) [3]

Большое спасибо всем, кто откликнулся, господа.

Digitman © (17.01.03 08:34)
.....
например, так :

create procedure ...
as
begin
... что-то, могущее вызвать исключение
when <условие> do
exception MYEXCEPTION "Такой-то текст";
end

примерно так я и работаю с нестандартными (своими) исключениями. Это очень доходчиво описано по ссылке http://www.ibase.ru/devinfo/customex.htm
которую дал Delirium^.Tremens и естественно стараюсь "не забыть при этом лишь откатить нужную транзакцию, если требует логика"

Я надеялся, что есть возможность использовать туже (или похожую) технологию для стандартных исключений, т.к. это действительно простая и удобная технология. Но очевидно "не все так просто как есть на самом деле" :)

Буду поступать так как и планировал: писать парсер сообшений и вызывать его именно через try...except...end, т.к. это всетаки более гибкий вариант чем в Application.OnExcept.


> Alexandr © (17.01.03 11:08)
> юзеру достаточно написать типа "обновление данных не прошло".
> Ну и причину указать по-возможности...
> А в лог уже полное сообщение об ошибке записать, да еще
> и дополнительной информацией.
> И лог скинутьписьмом разработчику - пусть разбирается.

Чесно говоря меня бесит когда мои или чужие программы валятся с подобным сообщением. Просто в 80% случаев, когда с экрана юзер может прочитать в чем ошибка, можно разобратся или понять в чем причина ошибки по телефону, а не ехать через весь город чтоб узнать, что юзер вместо точки запятую как разделитель использовал (хотя именно такой вариант я уже предвидел :)) и потом самому ехать или посылать колото с новым exe-шником....


kaif   (2003-01-17 11:14:00) [4]

> filyandiya (17.01.03 10:58)
Спасибо за ссылку.
Я давно видно туда не заглядывал (или вообще не знал о существовании такой страницы). Там у них не очень прозрачный сайт...

>Digitman © (17.01.03 11:05)

Согласен.

Наибольшая проблема в FB и Yaffils для меня - это ограничение 31 символ на длину идентификаторов таблиц и полей (кстати, вроде снятое в последних версиях IB). Это ограничение уменьшает длину названий таблиц до 14 символов, если я ввожу именование foreign key constraints в стиле типа FK_<имя таблицы1>_<имя таблицы2>


Alexandr   (2003-01-17 11:08:00) [5]

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


Digitman   (2003-01-17 11:05:00) [6]


> kaif


Да, по поводу исключений, относящихся к индекному автоконтролю reference integrity - есть такой момент. Но ведь мало ли иных исключений, для обработки которых (по авторскому сабжу) можно с успехом воспользоваться сим механизмом ! При всех видимых недостатках этот механизм позволяет не заботиться об анализе и "переводе" текста исключений на стороне клиента, а "выбрасывать" их клиенту AS IS, не забывая при этом лишь откатить нужную транзакцию, если требует логика


kaif   (2003-01-17 11:00:00) [7]

> Digitman © (17.01.03 10:48)

Да, я уверен, что при динамическом формировании
exception MyException "Некое сообщение об исключении"
это заработает. Обязательно попробую. Век живи - век учись!
Работает же русский текст в хранимых процедурах без проблем.
Я тоже чувствую, что все глюки происходят при записи в поле системной таблицы, а не в BLR. Например, мне никогда не удавалось завести русских пользователей в isc4.gdb. Я имею в виду не user_name, а их реквизиты, что весьма странно...
Как раз у меня в большей степени проблемы с переводом нестандартных exception, для которых, в отличие от foreign key violation не напишешь универсальный парсер ошибок в приложении.


filyandiya   (2003-01-17 10:58:00) [8]

>kaif

http://yaffil.ibase.ru/differs.htm


Feature Firebird 1.5 | Yaffil 835
---------------------------------------------------------
EXCEPTION name [message_text] | Yes | 836
---------------------------------------------------------


Digitman   (2003-01-17 10:52:00) [9]


> filyandiya



> почему в дистрибутиве с FB1.5 нет лицензии


А где ты вообще дистрибутив видел ?)
Пока нет офиц.релиза и пока нет даже beta, FB1.5 свободен к распространению и анонсируется как snaphot

К тому же исходники на сей момент полностью открыты - качай, правь и строй свой вариант FB, формируй из него дистрибутив и влупи туда хоть лицензию любую хоть черта)


filyandiya   (2003-01-17 10:48:00) [10]

>Digitman
вопрос не по теме, но...
кстати, почему в дистрибутиве с FB1.5 нет лицензии???


Digitman   (2003-01-17 10:48:00) [11]


> kaif


К тому же - обрати внимание - никто не заставляет тебя формировать исключение в таблице RDB$EXCEPTIONS с кириллицей.

Можно сделать так :
create exception MyException "Some Exception Message"

реальный же текст исключения будет формироваться динамически при выполнении
exception MyException "Некое сообщение об исключении"

не думаю, что restore каким-либо образом "споткнется" при попытке записать в BLR строку с кириллицей - "спотыкается" он как правило на записи кириллицы в таблицу (в дан.случае - в RDB$EXCEPTIONS)


kaif   (2003-01-17 10:47:00) [12]

2 Digitman © (17.01.03 10:40)
Вообще-то это интересно... Это открывает некоторые новые возможности.
Хотя нарушения foreign key все равно придется обрабатывать стандартным образом, так как в триггерах проверки потенциального нарушения ссылочной целостности не корректны (в рамках транзакций). Об этом в свое время мне сообщил Alexandr и я с ним полностью согласен. Хотя если мало пользователей и изменения вносятся редко, то можно иногда воспользоваться и триггером. Но это в качестве исключения, а не правила.


Digitman   (2003-01-17 10:40:00) [13]


> filyandiya


Можно. Начиная с FB1.5


> kaif


Не спорю - все должно подвергаться тщательной проверке. Тем более что FB1.5 пока еще - alpha

Но тем не менее - вариант же ?


kaif   (2003-01-17 10:37:00) [14]

2 filyandiya (17.01.03 10:31)
А что в Yaffils можно явно задать параметр message в момент вызова exception? Я не знал...


kaif   (2003-01-17 10:36:00) [15]

2 Digitman © (17.01.03 08:34)
С русскими текстами Exception сервера Yaffils-821 (наверно и в IB6.0 тоже) возникает проблема при Restore Database (arithmetic error or string truncation). Поэтому я не использую русские сообщения exception, а вынужден их тоже переводить. :((
В общем, нужно это проверить для того клона IB6, который используется, а то можно попасть впросак в самом конце разработки системы (когда выяснится, что backup невозможен).


filyandiya   (2003-01-17 10:31:00) [16]

разве можно использовать в FB параметры в exception??? это же вроде только в Yaffil...


Digitman   (2003-01-17 08:34:00) [17]

>Andrey

Если таки речь идет о FB, то есть еще один вариант - переложить бизнес-логику формирования текста исключения на сервер (в триггер либо SP)

например, так :

create procedure ...
as
begin
... что-то, могущее вызвать исключение
when <условие> do
exception MYEXCEPTION "Такой-то текст";
end


aston   (2003-01-17 07:00:00) [18]

Полностью согласен с kaif.
Код ошибки ты всегда знаешь.
E.Message тоже знаешь.
Формат E.Message известен заранее. По крайней мере, в ORACLE, не знаю как в IB.

Требуется написать только парсер для E.Message, что не так уж и сложно.
Для нормального отображения имен таблиц и полей нужно подерживать свой словарь (метаданные). А лучше поддержать словарь для constraint"ов типа "CONSTRAINT_NAME"-"VIOLATION_MESSAGE".

Удачи.


kaif   (2003-01-17 03:26:00) [19]

Я лично именую констрейнты. Например:
ALTER TABLE ... ADD CONSTRAINT FK_INVOICE_GOODS...
Затем в Application.OnException я перехватываю ошибки типа EIBError, анализирую код ошибки, если это код foreign key violation, то отыскиваю в E.Message подстроку, начинающуюся с "FK_", далее вырезаю имена таблиц, полей и т.п., перевожу это на русский (типа инвойсы, товары) благо я знаю, что у меня где находится, и выдаю сообщение на русском с подробными сведениями типа:
"Попытка нарушения ссылочной целостности Инвойс->Товар".
Кстати, не так уж много кода все это отнимает.
Существуют и русские варианты .msg-файла в интернет, но я не рискую их использовать, так как у меня работают разные клоны IB6.0 типа Firebird или Yaffils.


Andrey   (2003-01-16 19:46:00) [20]

>Alexandr
Во-во, именно так.
Поэтому прийдется писать нечто типа:
try
IBQuery1.ExecSQL;
except
on E: Exception do
if E is EIBError then
begin
{
и здесь вызывать функцию анализирующую
EIBError(E).IBErrorCode
EIBError(E).SQLCode
а возможно и
EIBError(E).Message
}
end;
else raise;
end;


А дальше в функции буду формировать окно сообщения если надо.

Эх... вот вам и логика на сервере...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо