Форум: "Базы";
Текущий архив: 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.054 c