Передать информацию об ошибке в исключение

o r a
Дата: 26.02.2007 14:58:20
Есть такой код:

DECLARE
  E:exception;
BEGIN
  begin
     ................
  exception when others then
    begin
       ...............
       INS_EXCEPTION_LOG(sqlerrm);
    exception when others then raise E;
    end;
  end;

  .................

EXCEPTION WHEN E THEN
  INS_EXCEPTION_LOG(sqlerrm);
END;

Как грамотно передать в нижний обработчик исключения (E) сообщение sqlerrm из верхнего обработчика исключений ?
tru55
Дата: 26.02.2007 15:01:03
Кто мешает сохранить в переменной?

PS нафига в верхнем EXCEPTION еще один блок EXCEPTION ?
o r a
Дата: 26.02.2007 15:04:38
tru55
Кто мешает сохранить в переменной?

PS нафига в верхнем EXCEPTION еще один блок EXCEPTION ?


Собственно я так и думал. А автоматически он туда никак не передастся ?


P.S. Если в верхнем exception возникло исключение, то мне нужно хотя бы знать, что это исключение в принципе было. Поэтому в нижнем exception записываю его в журнал, раз уж по какой-то причине не получилось его обработать.
orawish
Дата: 26.02.2007 15:07:19
Советую глянуть на матчасть: raise_application_error + raise(голый:)
tru55
Дата: 26.02.2007 15:08:23
o r a
tru55
Кто мешает сохранить в переменной?

PS нафига в верхнем EXCEPTION еще один блок EXCEPTION ?


Собственно я так и думал. А автоматически он туда никак не передастся ?


P.S. Если в верхнем exception возникло исключение, то мне нужно хотя бы знать, что это исключение в принципе было. Поэтому в нижнем exception записываю его в журнал, раз уж по какой-то причине не получилось его обработать.


Я не про это.
Почему вместо
exception when others then
    begin
       ...............
       INS_EXCEPTION_LOG(sqlerrm);
    exception when others then raise E;
    end;

не написать так
EXCEPTION 
   WHEN others THEN
       INS_EXCEPTION_LOG(sqlerrm);
       RAISE E;  
END;
o r a
Дата: 26.02.2007 15:15:37
tru55


Я не про это.
Почему вместо...



чтобы сделать более наглядным и компактным код. Т.к. в raise E не просто
INS_EXCEPTION_LOG(sqlerrm);

, это я тут для наглядности кратко описал,
и блоков:

begin
     ................
  exception when others then
    begin
       ...............
       INS_EXCEPTION_LOG(sqlerrm);
    exception when others then raise E;
    end;
  end;

несколько.

Вот и решил сделать одно raise E в конце для всех блоков и операторов, для наглядности и удобочитаемости кода.
o r a
Дата: 26.02.2007 15:24:38
tru55
o r a
tru55
Кто мешает сохранить в переменной?

PS нафига в верхнем EXCEPTION еще один блок EXCEPTION ?


Собственно я так и думал. А автоматически он туда никак не передастся ?


P.S. Если в верхнем exception возникло исключение, то мне нужно хотя бы знать, что это исключение в принципе было. Поэтому в нижнем exception записываю его в журнал, раз уж по какой-то причине не получилось его обработать.


Я не про это.
Почему вместо
exception when others then
    begin
       ...............
       INS_EXCEPTION_LOG(sqlerrm);
    exception when others then raise E;
    end;

не написать так
EXCEPTION 
   WHEN others THEN
       INS_EXCEPTION_LOG(sqlerrm);
       RAISE E;  
END;



Пардон, просмотрел не правильно Ваше сообщение.
Под многоточием у меня идёт собственно сам обработчик исключений, т.е. ряд операторов DML. Так вот если в них произойдёт исключение, то переходим в raise E; Ну а далее см. сообщение выше.
_spy_
Дата: 26.02.2007 16:10:57
после осуществления всех действий по обработке исключения выполняете
raise_application_error (-20001, sqlerrm);


Для возможности отлавливать исключение по имени можете написать

E Exception;
PRAGMA EXCEPTION_INIT(E, -20001);

в пакете, если у вас пакетные процедуры, либо в разделе объявлений процедуры верхнего уровня, отлавливающей исключение.
o r a
Дата: 27.02.2007 08:12:36
_spy_
после осуществления всех действий по обработке исключения выполняете
raise_application_error (-20001, sqlerrm);


Для возможности отлавливать исключение по имени можете написать

E Exception;
PRAGMA EXCEPTION_INIT(E, -20001);

в пакете, если у вас пакетные процедуры, либо в разделе объявлений процедуры верхнего уровня, отлавливающей исключение.

Спасибо