2011-08-09 22 views
1

我有一个正在编写的存储过程,如果它失败并出现任何类型的异常,我想以特定方式响应,但我仍想将异常传回给调用者。Oracle观察所有异常但未捕获

我该怎么做?

回答

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 

如果我理解你的问题正确,你只需要re-raise例外,一旦你抓住它。 (见上文中的异常块;基于例如从here


EDIT


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

可选OTHERS异常处理程序,其中始终是块或子程序中的最后一个 处理程序,充当所有 exc的处理程序eptions未具体指定。因此,块或子程序只能有一个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 ; 

Have a look at asktom to see his views WHEN OTHERS

但请记住,如果您只是想将异常传播到调用应用程序,则不需要捕获它。不捕获它,会自动让它冒泡。

+0

如何捕获所有,而不是一个特定的异常? – Malfist

+0

我编辑它来捕获所有异常。 – Malfist

+0

@Malfist,你'抓住所有'是OTHERS(做了上面的修改) – Harrison