Oracle观察所有异常但未捕获

Mal*_*ist 1 oracle exception-handling

我有一个正在编写的存储过程,如果它出现任何类型的异常,我想以特定的方式响应,但我仍然希望将异常传递给调用者.

我怎样才能做到这一点?

Har*_*son 5

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
Run Code Online (Sandbox Code Playgroud)

如果我正确理解了您的问题,您只需要在捕获它后重新引发异常.(参见上面的异常块;基于此处的示例)


编辑


从上面的链接:http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm#1069

可选的OTHERS异常处理程序(它始终是块或子程序中的最后一个处理程序)充当未具体命名的所有异常的处理程序.因此,块或子程序只能有一个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;
Run Code Online (Sandbox Code Playgroud)

使用WHEN OTHERS时有一些警告,例如你应该避免使用WHEN OTHERS来吞下错误而什么都不做

...

WHEN OTHERS
NULL ; --swallowing the exception, not propagating it, just ignoring it.  This will be problematic!
END ;
Run Code Online (Sandbox Code Playgroud)

但你可以这样做:

WHEN OTHERS
  LOGException(...) ; /** look at the asktom link for his example **/
  RAISE; --always follow up with a RAISE!
END ;
Run Code Online (Sandbox Code Playgroud)

看看问题,看看他人的观点吧!

但请记住,如果您只是希望将异常传播到调用应用程序,则无需捕获它.不捕捉它,会自动冒出来.