Oracle соблюдает все исключения, но не захватывает - PullRequest
1 голос
/ 09 августа 2011

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

Как я могу это сделать?

1 Ответ

5 голосов
/ 09 августа 2011
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 ;

Посмотрите на Асктома, чтобы увидеть его взгляды, КОГДА ДРУГИЕ !

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...