Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.02.06;
Скачать: [xml.tar.bz2];

Вниз

Замена сообщений в стандартных 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.01 c
14-15822
Anatoly Podgoretsky
2003-01-22 07:38
2003.02.06
Именинники 22 января


4-15987
Delchiv
2002-12-13 22:02
2003.02.06
Клик в неактивном окне


14-15838
hedgehoge
2003-01-22 18:52
2003.02.06
HTML печать в фоне


1-15747
Brain
2003-01-27 11:24
2003.02.06
Items - Очень надо.


3-15509
Kurt_
2003-01-20 19:53
2003.02.06
Как заставить Locate искать не только с начала набора данных по п





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский