Mal*_*ist 1 oracle exception-handling
我有一个正在编写的存储过程,如果它出现任何类型的异常,我想以特定的方式响应,但我仍然希望将异常传递给调用者.
我怎样才能做到这一点?
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)
但请记住,如果您只是希望将异常传播到调用应用程序,则无需捕获它.不捕捉它,会自动冒出来.