Текущий архив: 2003.02.06;
Скачать: CL | DM;
ВнизЗамена сообщений в стандартных Exceptions Найти похожие ветки
← →
Andrey (2003-01-14 17:55) [0]Собственно это и есть вопрос.
Можно ли вместо стандартного сообщения в 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-а в триггере. Это естественно плохой выход значительно замедляющий работу.
← →
Delirium^.Tremens (2003-01-14 17:57) [1]interbase.msg
← →
Andrey (2003-01-14 18:12) [2]Это конечно интересный вариант, но файл interbase.msg несколько неудобочитаем, и (что более важно) хотелось бы при нарушении различных constraint-ов к различным таблицам выдавать раличные сообщения. Тоесть при нарушении primary key в разных таблицах хотелось бы выдавать сообщения различающиеся не только именем таблици.
← →
Delirium^.Tremens (2003-01-14 18:17) [3]
> Это конечно интересный вариант, но файл interbase.msg несколько
> неудобочитаем
http://www.ibexpert.com
← →
Andrey (2003-01-14 18:20) [4]Посмотрим, но всеравно недумаю, что ibexpert ответит на вторую часть:
> Тоесть при нарушении primary key в разных таблицах хотелось
> бы выдавать сообщения различающиеся не только именем таблици.
← →
Andrey (2003-01-15 10:45) [5]Знаете, я возможно плохо искал, но я ничего подходящего для реализации того что я прошу ненашел.
Также интересно послушать альтернативные мнения.
← →
Delirium^.Tremens (2003-01-15 10:52) [6]http://www.ibase.ru/devinfo/customex.htm
http://www.ibase.ru/develop.htm
← →
Andrey (2003-01-15 11:03) [7]Я это читал и даже использую, но как вызов стандартного Exception (возникающего допустим при нарушении primary key) заменить вызовом своего всеравно непонимаю. Уж объясните слабоумному пожалуста :)
← →
Andrey (2003-01-15 16:56) [8]Неужели мнения закончились?
← →
filyandiya (2003-01-16 10:00) [9]...странно что никто не ответил, может и нет нормального решения - по идее IB возвращает код ошибки и собственно сообщение - если не править .msg файл, то выход только один - в обработчике - ну либо OnPostError(у Query), либо OnException (у Application) либо еще где... смотреть код и выдавать свое сообщение
Как доставать имена таблиц и полей которые собственно както связаны с ошибкой я не знаю - если только в клиенте до внесения изменений проверить данные на корректность (BeforePost)
:) можно извратиться - написать парсер сообщений IB - и из них извлекать данные об ошибке - опятьже для упрощения разбора можно подправить сообщения в .msg файле - опять же при помощи IBExpert
← →
Alexandr (2003-01-16 10:20) [10]в приложениях не должно быть сообщений об ошибках, которые программист не предусмотрел.
← →
Andrey (2003-01-16 19:46) [11]>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;
А дальше в функции буду формировать окно сообщения если надо.
Эх... вот вам и логика на сервере...
← →
kaif (2003-01-17 03:26) [12]Я лично именую констрейнты. Например:
ALTER TABLE ... ADD CONSTRAINT FK_INVOICE_GOODS...
Затем в Application.OnException я перехватываю ошибки типа EIBError, анализирую код ошибки, если это код foreign key violation, то отыскиваю в E.Message подстроку, начинающуюся с "FK_", далее вырезаю имена таблиц, полей и т.п., перевожу это на русский (типа инвойсы, товары) благо я знаю, что у меня где находится, и выдаю сообщение на русском с подробными сведениями типа:
"Попытка нарушения ссылочной целостности Инвойс->Товар".
Кстати, не так уж много кода все это отнимает.
Существуют и русские варианты .msg-файла в интернет, но я не рискую их использовать, так как у меня работают разные клоны IB6.0 типа Firebird или Yaffils.
← →
aston (2003-01-17 07:00) [13]Полностью согласен с kaif.
Код ошибки ты всегда знаешь.
E.Message тоже знаешь.
Формат E.Message известен заранее. По крайней мере, в ORACLE, не знаю как в IB.
Требуется написать только парсер для E.Message, что не так уж и сложно.
Для нормального отображения имен таблиц и полей нужно подерживать свой словарь (метаданные). А лучше поддержать словарь для constraint"ов типа "CONSTRAINT_NAME"-"VIOLATION_MESSAGE".
Удачи.
← →
Digitman (2003-01-17 08:34) [14]>Andrey
Если таки речь идет о FB, то есть еще один вариант - переложить бизнес-логику формирования текста исключения на сервер (в триггер либо SP)
например, так :
create procedure ...
as
begin
... что-то, могущее вызвать исключение
when <условие> do
exception MYEXCEPTION "Такой-то текст";
end
← →
filyandiya (2003-01-17 10:31) [15]разве можно использовать в FB параметры в exception??? это же вроде только в Yaffil...
← →
kaif (2003-01-17 10:36) [16]2 Digitman © (17.01.03 08:34)
С русскими текстами Exception сервера Yaffils-821 (наверно и в IB6.0 тоже) возникает проблема при Restore Database (arithmetic error or string truncation). Поэтому я не использую русские сообщения exception, а вынужден их тоже переводить. :((
В общем, нужно это проверить для того клона IB6, который используется, а то можно попасть впросак в самом конце разработки системы (когда выяснится, что backup невозможен).
← →
kaif (2003-01-17 10:37) [17]2 filyandiya (17.01.03 10:31)
А что в Yaffils можно явно задать параметр message в момент вызова exception? Я не знал...
← →
Digitman (2003-01-17 10:40) [18]
> filyandiya
Можно. Начиная с FB1.5
> kaif
Не спорю - все должно подвергаться тщательной проверке. Тем более что FB1.5 пока еще - alpha
Но тем не менее - вариант же ?
← →
kaif (2003-01-17 10:47) [19]2 Digitman © (17.01.03 10:40)
Вообще-то это интересно... Это открывает некоторые новые возможности.
Хотя нарушения foreign key все равно придется обрабатывать стандартным образом, так как в триггерах проверки потенциального нарушения ссылочной целостности не корректны (в рамках транзакций). Об этом в свое время мне сообщил Alexandr и я с ним полностью согласен. Хотя если мало пользователей и изменения вносятся редко, то можно иногда воспользоваться и триггером. Но это в качестве исключения, а не правила.
← →
Digitman (2003-01-17 10:48) [20]
> kaif
К тому же - обрати внимание - никто не заставляет тебя формировать исключение в таблице RDB$EXCEPTIONS с кириллицей.
Можно сделать так :
create exception MyException "Some Exception Message"
реальный же текст исключения будет формироваться динамически при выполнении
exception MyException "Некое сообщение об исключении"
не думаю, что restore каким-либо образом "споткнется" при попытке записать в BLR строку с кириллицей - "спотыкается" он как правило на записи кириллицы в таблицу (в дан.случае - в RDB$EXCEPTIONS)
← →
filyandiya (2003-01-17 10:48) [21]>Digitman
вопрос не по теме, но...
кстати, почему в дистрибутиве с FB1.5 нет лицензии???
← →
Digitman (2003-01-17 10:52) [22]
> filyandiya
> почему в дистрибутиве с FB1.5 нет лицензии
А где ты вообще дистрибутив видел ?)
Пока нет офиц.релиза и пока нет даже beta, FB1.5 свободен к распространению и анонсируется как snaphot
К тому же исходники на сей момент полностью открыты - качай, правь и строй свой вариант FB, формируй из него дистрибутив и влупи туда хоть лицензию любую хоть черта)
← →
filyandiya (2003-01-17 10:58) [23]>kaif
http://yaffil.ibase.ru/differs.htm
Feature Firebird 1.5 | Yaffil 835
---------------------------------------------------------
EXCEPTION name [message_text] | Yes | 836
---------------------------------------------------------
← →
kaif (2003-01-17 11:00) [24]> Digitman © (17.01.03 10:48)
Да, я уверен, что при динамическом формировании
exception MyException "Некое сообщение об исключении"
это заработает. Обязательно попробую. Век живи - век учись!
Работает же русский текст в хранимых процедурах без проблем.
Я тоже чувствую, что все глюки происходят при записи в поле системной таблицы, а не в BLR. Например, мне никогда не удавалось завести русских пользователей в isc4.gdb. Я имею в виду не user_name, а их реквизиты, что весьма странно...
Как раз у меня в большей степени проблемы с переводом нестандартных exception, для которых, в отличие от foreign key violation не напишешь универсальный парсер ошибок в приложении.
← →
Digitman (2003-01-17 11:05) [25]
> kaif
Да, по поводу исключений, относящихся к индекному автоконтролю reference integrity - есть такой момент. Но ведь мало ли иных исключений, для обработки которых (по авторскому сабжу) можно с успехом воспользоваться сим механизмом ! При всех видимых недостатках этот механизм позволяет не заботиться об анализе и "переводе" текста исключений на стороне клиента, а "выбрасывать" их клиенту AS IS, не забывая при этом лишь откатить нужную транзакцию, если требует логика
← →
Alexandr (2003-01-17 11:08) [26]юзеру достаточно написать типа "обновление данных не прошло".
Ну и причину указать по-возможности...
А в лог уже полное сообщение об ошибке записать, да еще и дополнительной информацией.
И лог скинутьписьмом разработчику - пусть разбирается.
← →
kaif (2003-01-17 11:14) [27]> filyandiya (17.01.03 10:58)
Спасибо за ссылку.
Я давно видно туда не заглядывал (или вообще не знал о существовании такой страницы). Там у них не очень прозрачный сайт...
>Digitman © (17.01.03 11:05)
Согласен.
Наибольшая проблема в FB и Yaffils для меня - это ограничение 31 символ на длину идентификаторов таблиц и полей (кстати, вроде снятое в последних версиях IB). Это ограничение уменьшает длину названий таблиц до 14 символов, если я ввожу именование foreign key constraints в стиле типа FK_<имя таблицы1>_<имя таблицы2>
← →
Andrey (2003-01-20 13:19) [28]Большое спасибо всем, кто откликнулся, господа.
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-шником....
← →
Alexandr (2003-01-20 13:30) [29]я же писал: автоматически программисту отсылать сообщение об ошибке. А потом так же автоматически скачивать патч :)
← →
Andrey (2003-01-20 13:46) [30]>Alexandr
Эх, батенька... Клиентура у нас разная :)
У меня (нашей организации) клиенты ЖЕК-и, и районные администрации восновном. Какой уж тут Интернет, хоть бы простенькая сетка иногда работала и то хорошо :))
Страницы: 1 вся ветка
Текущий архив: 2003.02.06;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.01 c