Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Стивен Фернстайн "Об исключениях и правилах"  [new]
Alexey123
Member

Откуда: Москва
Сообщений: 360
Прочитал статейку:
http://www.interface.ru/home.asp?artId=20961

Неужели стоит переделывать все функции и добавлять к ним лишних два параметра, как предлагает многоуважаемый член коллегии Oracle ACE?

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

....
    MY_CODE NUMBER:=-20001;
    MY_MESSAGE VARCHAR2(200):='Текст сообщения';
BEGIN
 .....
 IF ... THEN 
        raise_application_error(MY_CODE,MY_MESSAGE);
 END IF;
END;
или
....
   MY_EXCEPTION EXCEPTION;
   PRAGMA EXCEPTION_INIT(MY_EXCEPTION, -60);
BEGIN
 .....
 IF .... THEN 
   RAISE MY_EXCEPTION;
 END IF;
END;

2. Если в процедуре может возникнуть исключение, например NO_DATA_FOUND будет ли красиво его возвращать к верху? Или всегда нужно их перекрываться своими исключениями, пример:
create or replace procedure get_student(id in number, name out varchar2)
as
   STUDENT_NOT_EXISTS EXCEPTION;
   PRAGMA EXCEPTION_INIT(STUDENT_NOT_EXISTS, -60);
begin
 select 1
 into name
 from dual
 where 1=2;
exception
 when no_data_found then
    raise STUDENT_NOT_EXISTS;
end;
Соответственно в каждом PL/SQL блоке, вызывающем это процедуру придётся добавлять
   STUDENT_NOT_EXISTS EXCEPTION;
   PRAGMA EXCEPTION_INIT(STUDENT_NOT_EXISTS, -60);
19 окт 11, 11:56    [11464902]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
Elic
Member

Откуда:
Сообщений: 29976
Alexey123
   PRAGMA EXCEPTION_INIT(STUDENT_NOT_EXISTS, -60);
За такое - по рукам.
19 окт 11, 12:13    [11465084]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
Alexey123
Member

Откуда: Москва
Сообщений: 360
Elic, т.е. всегда использовать
raise_application_error(MY_CODE,MY_MESSAGE);
?
19 окт 11, 12:17    [11465130]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
борсч суп
Guest
Alexey123
2. Если в процедуре может возникнуть исключение, например NO_DATA_FOUND будет ли красиво его возвращать к верху? Или всегда нужно их перекрываться своими исключениями, пример:

Это зависит от того, ожидается ли, что элемента может не быть или нет.
Предположим в базе данных поликлиники в анкете "Поциендт" можно нажать на кнопку "паспорт", но паспортных данных может не быть.
В таком случае исключение no_data_found не должно возвращаться наверх. Если же паспортные данные должны быть у всех, а у кого-то их вдруг не оказалось - исключение надо возвращать на уровень выше.
Можно и без своего кода, но лучше с ним. Представим, что приложение, которое запрашивает эти данные не человек через UI, а какое-то приложение на джаве, которое круглосуточно занимается массовой обработкой анкет.
И вот в одной нет каких-то данных, анкета не сможет быть обработана. Приложение анкету пропускает, логгирует ошибку и берет следующую анкету. Что лучше написать в логах "no data found" или "student does not exist!"?
19 окт 11, 12:33    [11465260]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
Alexey123
Elic, т.е. всегда использовать
raise_application_error(MY_CODE,MY_MESSAGE);
?

Речь о том, что для пользовательских исключений есть диапазон кодов 20000-20999 (да и то с оговорками).
19 окт 11, 12:35    [11465278]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Alexey123
Elic, т.е. всегда использовать
raise_application_error(MY_CODE,MY_MESSAGE);
?


это значило что ваши коды для ексешпнов должны быть в диапазоне -20000 -20999
19 окт 11, 12:37    [11465288]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
Alexey123
Member

Откуда: Москва
Сообщений: 360
Спасибо за ответы, но что всё-таки надо использовать в процедурах
RAISE и PRAGMA EXCEPTION_INIT
или
raise_application_error ?
19 окт 11, 12:42    [11465324]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Мое ИМХО:
Исключительные ситуации с т.з. разработчика можно условно разделить на три вида:
- Непредвиденные
К таким относится, к примеру, ORA-4030 или, скажем, ORA-0600
Особые приметы: ситуация не связана непосредственно с бизнес-логикой приложения, ее возникновение сложно/невозможно предвидеть во время разработки.
Обработка - производится обычно обработчиком "по умолчанию" и сводится к записи страшных витиеватых ругательств (с указанием stacktrace, errstack) в логи/алерты.
Пользователь обычно видит в этом случае что-то вроде "все пропало, обратитесь к администратору"

- Пользовательские
В противоположность непредвиденным - этот вид особых ситуаций полностью находится в компетенции пользователя и описан в юзер гайде на систему.
К примеру: "нет возможности зарезервировать товар - все пожрал хомяк"
Обработка - производится пользователем.
Задача разработчика - корректно диагностировать подобную ситуацию и вернуть вменяемое сообщение. Тут подходит raise_application_error.

Классифицировать исключительную ситуацию как пользовательскую преимущественно должен метод, ближе всего (по стеку вызовов) к этому пользователю расположенный. Именно тут есть необходимый контекст бизнес-операции, позволяющий состряпать адекватное сообщение. Все что "топ-левел" метод зовет из-под себя - удобнее считать утилитарными методами, в которых можно обходиться простым raise.

- Технические
Ситуации, которые могут встречаться в коде, но не относятся непосредственно к предыдущим двум видам.
К примеру, "no_data_found" или "dup_val_on_index"
Обработка непосредственно в коде в соответствии с логикой приложения.
В зависимости от того где и при каких обстоятельствах встретилась такая ситуация она может быть:
а) особой ситуацией и обработана "на месте"
б) ошибочной ситуацией и передана вызывающему
в) переквалифицирована в пользовательскую особую ситуацию.

К примеру, тот же no_data_found - может означать:

а) в локальном PL/SQL массиве нет нужного ключа, логика позволяет добавить нужный ключ и продолжить исполнение.
б) по переданному в качестве параметра ключу не найдена необходимая запись, продолжение невозможно, информируем вызывающего (raise).
в1) перед созданием словарной статьи вызвали метод, который должен был вернуть словарную статью если такая существует. Метод вернул NO_DATA_FOUND - ок, для того и звали чтобы убедиться - вставляем статью :)
в2) из "топового" пакета вызвали утилитарный метод, который должен был вернуть словарную статью.
Метод вернул NO_DATA_FOUND - непорядок в параметрах, требуется внимание конечного пользователя.
Зная контекст бизнес-операции пишем вменяемое сообщение вида "марьванна, в городе N-нск отсутствует улица Кой-кого, вы наверное опечатались" и поднимаем посредством raise_application_error.
19 окт 11, 13:07    [11465544]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
борсч суп
Guest
Андрюша,
У тебя в списке нет бизнес-непредвиденных ситуаций. Бизнес ora-600
19 окт 11, 13:16    [11465650]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
борсч суп
У тебя в списке нет бизнес-непредвиденных ситуаций. Бизнес ora-600

Если возможно - слегка подразверните свою мысль.
19 окт 11, 13:21    [11465709]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
andrey_anonymous,

Например неперхваченный no_data_found.
19 окт 11, 13:25    [11465750]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
Alexey123
Member

Откуда: Москва
Сообщений: 360
andrey_anonymous, так, подумаю о реализации вашей концепции...
- Значит непредвиденные отравляются в лог некой процедурой, а пользователю стандартное сообщение "Всё упало, обратитесь к администратору" это через raise_application_error
- для пользовательских исключений в пакетах и процедурах топ-левела создаём таблицу исключений, что-бы не путать коды и через raise_application_error
- технические не из топ-левела вызываются через RAISE и PRAGMA EXCEPTION_INIT чтобы топ-левел по коду мог их обработать?

А как можно точно разделить код на топ-левел? Если процедура может вызыватся и в пользовательском приложении и в другом пакете?
19 окт 11, 13:27    [11465781]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
_Nikotin
Например неперхваченный no_data_found.

И?
Коллеги, давайте не будем загадками загадываться.
Если есть мысль - ее надо изложить, чтобы другие могли подумать вместе с вами :)
19 окт 11, 13:28    [11465795]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
борсч суп
Guest
andrey_anonymous
борсч суп
У тебя в списке нет бизнес-непредвиденных ситуаций. Бизнес ora-600

Если возможно - слегка подразверните свою мысль.

Когда процедура запроса мощности пылесоса обнаруживает, что тип товара это телевизор, а не пылесос.
19 окт 11, 13:35    [11465877]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Alexey123
А как можно точно разделить код на топ-левел? Если процедура может вызыватся и в пользовательском приложении и в другом пакете?

Вообще - это задача архитектора.
"топы" - реализуют бизнес-логику в терминах бизнес-логики.
Утилитарные реализуют технологические операции.
В Вашем сценарии имеют место признаки смешения бизнес-уровня и утилитарной операции.
Их можно разделить.

...вообще ситуации, когда один кусок бизнес-логики зовет другой кусом опять-таки бизнес-логики - характерны скорее для интеграционных проектов, где бизнес-exception одной системы выступает в роли особой технологической ситуации для другой. Но это уже совсем другие игры, и они играются на другом поле.
19 окт 11, 13:35    [11465880]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Alexey123
- для пользовательских исключений в пакетах и процедурах топ-левела создаём таблицу исключений, что-бы не путать коды и через raise_application_error

Для пользовательских исключений использовать пользовательские исключения + переменную для хранения текста, а raise_application_error вызвать на верхнем уровне.
19 окт 11, 13:37    [11465895]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
борсч суп
andrey_anonymous
пропущено...

Если возможно - слегка подразверните свою мысль.

Когда процедура запроса мощности пылесоса обнаруживает, что тип товара это телевизор, а не пылесос.

Это пользовательское исключение "Неверный тип товара" с точки зрения приложения.
19 окт 11, 13:38    [11465915]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
борсч суп
andrey_anonymous
пропущено...
Если возможно - слегка подразверните свою мысль.

Когда процедура запроса мощности пылесоса обнаруживает, что тип товара это телевизор, а не пылесос.

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

Или Вы предлагаете какой-то особый порядок обработки таких ситуаций, отличный от 3 предложенных?
19 окт 11, 13:39    [11465920]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
борс суп
Guest
andrey_anonymous
борсч суп
пропущено...

Когда процедура запроса мощности пылесоса обнаруживает, что тип товара это телевизор, а не пылесос.

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

Или Вы предлагаете какой-то особый порядок обработки таких ситуаций, отличный от 3 предложенных?

и в какую же из 3х предложенных ситуаций это попадает?
19 окт 11, 13:41    [11465955]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
andrey_anonymous
_Nikotin
Например неперхваченный no_data_found.

И?

Я подумал что имелось в виду когда неперехваченных no_data_found проскакивает к клиенту. В приведенной классификации такого не будет (либо будет считаться багом), так как эта ситуация приведёт к "непредвиденному" исключению.
19 окт 11, 13:45    [11465976]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
борс суп
andrey_anonymous
В зависимости от контекста может быть классифицирована
...
Или Вы предлагаете какой-то особый порядок обработки таких ситуаций, отличный от 3 предложенных?

и в какую же из 3х предложенных ситуаций это попадает?

andrey_anonymous
...
В зависимости от контекста может быть классифицирована...

Но мне было интересно именно Ваше видение.
19 окт 11, 13:45    [11465981]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
Alexey123
Member

Откуда: Москва
Сообщений: 360
_Nikotin
Для пользовательских исключений использовать пользовательские исключения
очень понятно))
19 окт 11, 13:46    [11465988]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
имхо, процедур по-настоящему топлевелных - еще надо поискать.
вызываются они всегда из среды, способной исключения обрабатывать. ну и обрабатывать те исключения надо
(не только внутри процедуры, но и..) именно там, где вызов её происходит.
т.е. раз и навсегда проститься с иллюзией, что можно написать процедуру, способную обработать (читается как сожрать и превратить в некое аут значение) всё исключительное внутри ея. и статья по ссылке обсуждает в связи с этим, лишь один нюанс (имхо) не самый критичный, но, действительно, способный удивить (если о нем забыли).
19 окт 11, 14:04    [11466193]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Alexey123
_Nikotin
Для пользовательских исключений использовать пользовательские исключения
очень понятно))

просто MY_EXCEPTION EXCEPTION без PRAGMA EXCEPTION_INIT
19 окт 11, 14:12    [11466281]     Ответить | Цитировать Сообщить модератору
 Re: Стивен Фернстайн "Об исключениях и правилах"  [new]
Alexey123
Member

Откуда: Москва
Сообщений: 360
_Nikotin, orawish, так если везде писать только RAISE без PRAGMA EXCEPTION_INIT, как верхний уровень (пакет топ-левела или приложение) узнает какая именно ситуация сложилась в выполняемой процедуре?

_Nikotin
Для пользовательских исключений использовать пользовательские исключения + переменную для хранения текста, а raise_application_error вызвать на верхнем уровне.

А чем переменная хранения текста лучше чем raise_application_error? raise_application_error можно сверху обработать через OTHERS и получить код SQLCODE
19 окт 11, 14:51    [11466680]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить