DECLARE
pe_ratio NUMBER(3,1);
BEGIN
SELECT price / earnings INTO pe_ratio FROM stocks
WHERE symbol = 'XYZ'; -- might cause division-by-zero error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio);
COMMIT;
EXCEPTION -- exception handlers begin
WHEN ZERO_DIVIDE THEN -- handles 'division by zero' error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', NULL);
COMMIT;
RAISE ; --This will reraise your exception
END; -- exception handlers and block end here
Если я правильно понимаю ваш вопрос, вам просто нужно повторно поднять исключение, как только вы его захватите. (см. выше в блоке исключений; на основе примера из здесь )
EDIT
По ссылке выше: http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm#1069
Необязательный обработчик исключений OTHERS, который всегда последний
обработчик в блоке или подпрограмме, действует как обработчик для всех
исключения не названы специально. Таким образом, блок или подпрограмма может
есть только один ДРУГОЙ обработчик.
EXCEPTION
WHEN ZERO_DIVIDE THEN
-- handle the error
WHEN NO_DATA_FOUND THEN
-- handle the error
WHEN OTHERS THEN
-- handle all other errors
END;
Существуют предостережения относительно использования WHEN OTHERS , например, вам следует избегать использования WHEN OTHERS, чтобы глотать ошибки и ничего не делать
...
WHEN OTHERS
NULL ; --swallowing the exception, not propagating it, just ignoring it. This will be problematic!
END ;
однако вы могли бы сделать это:
WHEN OTHERS
LOGException(...) ; /** look at the asktom link for his example **/
RAISE; --always follow up with a RAISE!
END ;
Посмотрите на Асктома, чтобы увидеть его взгляды, КОГДА ДРУГИЕ !
Но имейте в виду, что если вы хотите, чтобы исключение распространялось на вызывающее приложение, вам не нужно его захватывать. Не захватывая его, он автоматически всплывет.