Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.11;
Скачать: CL | DM;

Вниз

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

 
Игорь Шевченко ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.02 c
15-1191992179
Бакук
2007-10-10 08:56
2007.11.11
В России запретят CD-RW и DVD-RW


2-1192772617
ses
2007-10-19 09:43
2007.11.11
combobox. edit;


2-1192617485
malyar
2007-10-17 14:38
2007.11.11
месага от колёсика мыши


2-1192777283
Quart
2007-10-19 11:01
2007.11.11
PickList


2-1192790942
Shakesbeer
2007-10-19 14:49
2007.11.11
Работа с com-портом.