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

Вниз

Кто и как передает сообщения об ошибках при работе в оракле ?   Найти похожие ветки 

 
Игорь Шевченко ©   (2007-07-02 12:58) [0]

Если ошибка возникает при работе PL/SQL функций или процедур.
С одной стороны хочется передать как можно больше информации, с другой не хочется заниматься анализом номеров сообщений Oracle.


 
Desdechado ©   (2007-07-02 13:10) [1]

Я показываю текст полностью, со всем стеком выполнения и лидирующим ORA-XXXX кодом ошибки.


 
Игорь Шевченко ©   (2007-07-02 13:24) [2]

Desdechado ©   (02.07.07 13:10) [1]

Имеется в виду, что клиент написан на Delphi и рядовой пользователь не обучен оракловским сообщениям. Заниматься анализом сообщений и переводом их на язык, понятный пользователю, неинтересно.
Мне и интересно, кто и как выходит из этой ситуации.


 
Gadenysh   (2007-07-02 13:37) [3]

пишу [1]  в лог, пользователю говорю - ошибка при выполнении того-то


 
Desdechado ©   (2007-07-02 14:03) [4]

Там, где есть оракл, есть человек, который в нем чуть-чуть шурупит. Ему и адресованы эти сообщения (для последующего слития разработчику). Юзеру же остается принять к сведению и запротоколировать последовательность действий и данные, с которыми он их вытворял, для воспроизведения ситуации.

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


 
Evgeny V ©   (2007-07-02 14:37) [5]

Игорь Шевченко ©   (02.07.07 12:58)

Показываю MessageBox с заголовком "Ошибка при работе с БД", а в  самом сообщении номер и текст ошибки оракла. Пользователю у нас достаточно заголовка, все остальное его не интерисует(да и не должен он это знать). Админ смотрит уже на текст сообщения. Работают обычно так - получили сообщение об ошибке, попробовали повторить... опять ошибка, зовут/звонят админа(у).


 
Игорь Шевченко ©   (2007-07-02 15:00) [6]

Desdechado ©   (02.07.07 14:03) [4]
Evgeny V ©   (02.07.07 14:37) [5]

Может, я скажу ересь, но. Клиент общается с сервером посредство вызовов функций пакетов и выборок из View. На другое прав у него нету. Все операции модификации выполняются через те же фукнции пакетов.
Разумеется, ошибка вида "Protocol adapter error" или "Oracle unavailable" передается пользователю в том виде, как она есть. Но нарушения каких-либо constraints желательно:

а) не проверять дополнительно ни на клиенте, ни на сервере - в конце концов есть сервер, он лучше знает.
б) показывать сообщения о таких нарушениях в понятном пользователю виде.

Об чем, собственно, и вопрос.


 
Anatoly Podgoretsky ©   (2007-07-02 15:09) [7]

> Игорь Шевченко  (02.07.2007 15:00:06)  [6]

в) не скрывать оригинальное сообщение об ошибке

А то тут насмотрелись подобного рода программы


try
  ...
except
  ShowMessage("Ошибка базы");
end;


 
atruhin ©   (2007-07-02 15:16) [8]

Мы делаем так:
try
 ...
except
 On E:Exception do begin
   ShowErrorMessage("Ошибка базы", E.Message);
   ...
 end
end;
где ShowErrorMessage  выводит окно с сообщением: "Ошибка базы" и кнопкой "Подробно",
при нажатии на которую показывает полный текст ошибки. Плюс дополнительно ведется лог файл,
отключается опцией.


 
Desdechado ©   (2007-07-02 15:59) [9]

> нарушения каких-либо constraints желательно:а) не проверять
> дополнительно ни на клиенте, ни на сервере - в конце концов
> есть сервер, он лучше знает.
Если оракл с русской локалью, то даже его сообщения достаточно информативны и понятны пользователю (если он захочет понять). В любом случае при работе через пакеты есть возможность ловить ошибки внутри процедур и юзеру дополнительно поднимать exception с понятным сообщением + оригинальным.


 
Игорь Шевченко ©   (2007-07-03 09:51) [10]

Desdechado ©   (02.07.07 15:59) [9]

То есть, ты предлагаешь внутри пакетов дополнительно проверять условия constraints (я по WHEN OTHERS не пойму, что было нарушен constraint) и вызывать RAISE_APPLICATION_ERROR c cформированным сообщением ?


 
Desdechado ©   (2007-07-03 11:06) [11]

> я по WHEN OTHERS не пойму, что было нарушен constraint
Почему это вдруг? Проверяешь конкретный код, например:
ORA-00001 unique constraint (string.string) violated
а остальные при надобности или в OTHERS


 
Игорь Шевченко ©   (2007-07-03 11:28) [12]

Desdechado ©   (03.07.07 11:06) [11]


> Почему это вдруг? Проверяешь конкретный код, например:


У меня 11 CHECK CONSTRAINTS и 3 FOREIGN KEY CONSTRAINTS

В принципе ясно, без дополнительных проверок либо на клиенте, либо на сервере, не обойтись. А жалко.


 
Desdechado ©   (2007-07-03 12:04) [13]

>  без дополнительных проверок на сервере не обойтись
М.б. и есть такие способы, но я о них не знаю.
А при множественности ограничений одинакового типа можно проверять их имена, чтобы выяснить, какое выбросило исключение (те самые string.string)
Естественно, в этом случае ограничения должны быть именованы явно, а не автоименованы SYS_...


 
MsGuns ©   (2007-07-03 12:10) [14]

Если исходить из того, что в "базе" хранятся не таблицы и записи, а информация обо ОБЪЕКТАХ, уложенная в таблицы, то правильно разработанная библиотека объектов сама должна "знать", как преобразовывать аварийные сообщения сервера в "удобоваримые"
Тем более, что число удобоваримых вариантов не так уж и много.


 
Игорь Шевченко ©   (2007-07-03 15:32) [15]

MsGuns ©   (03.07.07 12:10) [14]

В базе хранятся таблицы и записи.

Правильно разработанная библиотека объектов на PL/SQL - я, честно не представляю, как это осуществить, тем более переносимую с Oracle 8 до Oracle 10.

Проверять что-то на клиенте не получится, потому что не хочется.


 
Val ©   (2007-07-03 16:56) [16]

У нас, на схеме, есть своя табличка с кодами и адаптированными
(разработчиками) для пользователя текстами ошибок, как системных, так и пользовательских. Есть пакет с функциями извлечения текстов, и глобальные объекты перехвата на клиенте.
Отображается клиентом этот текст(для пользователя) и по доп. кнопке "Больше" - стек для администратора/разработчика.


 
Игорь Шевченко ©   (2007-07-03 17:02) [17]

Val ©   (03.07.07 16:56) [16]

Спасибо, как идею попробую взять на вооружение.


 
Sergey Masloff   (2007-07-03 20:55) [18]

Я делаю так:
В сообщение вставляется маркер. Все что после маркера отображается пользователю все что до маркера - системная информация. Она тоже уходит на клиент но пользователю (без дополнительного его вопроса) не отображается.

 Так как клиентов (типов) масса и не все из них пишем мы то довольно удобно - определены (письменно) правила работы и кто хочет их обрабатывает.
 В дельфийском клиенте сделано похоже на описание Val(c) только кроме книпки больше есть кнопка отправить сообщение разработчикам. Естественно кроме этого все исключения сбрасываются в текстовый лог (прозрачно для пользователя). При старте клиента этот лог пишется в базу (разобранным - по записи на каждое исключение. Так как клиентов несколько тысяч то потом очень удобно статистический анализ проводить. Хотя меня в оффтоп понесло.

 Ну и во всех процедурах есть
exception when ... then
 В котором разработчик может написать некий свой разборщик и должен написать что-то вроде when others then raise_application_error()
в которой текст оригинального сообщения конкатенируется с вышеописаным маркером и сообщением вида "непредвиденная ошибка в..."



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.039 c
2-1192777283
Quart
2007-10-19 11:01
2007.11.11
PickList


15-1190555879
Nchik93
2007-09-23 17:57
2007.11.11
Срочно нужен работающий дистрибутив Delphi. Пожалуйста.


11-1176527771
MTsv DN
2007-04-14 09:16
2007.11.11
Замечания и предложения (KOLnMCK v.2.57)


4-1178388982
buben
2007-05-05 22:16
2007.11.11
Application.Handle


2-1192131564
koss_
2007-10-11 23:39
2007.11.11
запрос работает в режиме только чтение





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский