2011-08-09 52 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