Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.55 MB
Время: 0.021 c
1-15545
OlegL
2003-01-27 11:17
2003.02.06
ComboBox


3-15507
bambina
2003-01-20 16:34
2003.02.06
kak dobavit novuyu zapis v tablicu Paradox?


1-15580
=SOFT=
2003-01-28 15:05
2003.02.06
Как узнать и правильно обработать выбранный фильтр в SaveDialog


1-15677
Yr2
2003-01-24 21:55
2003.02.06
TNMGeneralServer


3-15494
satron
2003-01-20 14:08
2003.02.06
Как не дать