oracle – PL / SQL異常處理:do nothing(忽略異常)
這是一個我經常被問到的問題.由於我在stackoverflow上找不到任何確切的重複,我以為我會把它作為參考.
題:
在PL / SQL中,我知道捕獲異常並執行程式碼,以及如何將它們傳播到呼叫塊.
例如,在以下過程中,NO_DATA_FOUND異常被直接處理,而所有其他異常都被呼叫到呼叫塊:
CREATE OR REPLACE PROCEDURE MY_PROCEDURE() IS BEGIN do_stuff(); EXCEPTION WHEN NO_DATA_FOUND THEN -- Do something handle_exception(); WHEN OTHERS THEN -- Propagate exception RAISE; END;
但是我應該使用什麼命令來忽略一個或所有引發的異常並將執行控制返回到呼叫塊?
雖然我同意99%的時間是不好的做法,默默地忽略異常,而不是至少將它們記錄在某個地方,但是具體情況是完全可以接受的.
在這些情況下,NULL是你的朋友:
[...] EXCEPTION WHEN OTHERS THEN NULL; END;
忽略例外可能需要的兩種典型情況是:
1)您的程式碼包含一個您知道的語句可能會偶爾失敗,您不希望此事件中斷您的程式流程.
在這種情況下,您應該將巢狀的語句包含在巢狀塊中,如下例所示:
CREATE OR REPLACE PROCEDURE MY_PROCEDURE() IS l_empoyee_nameEMPLOYEES.EMPLOYEE_NAME%TYPE; BEGIN -- Catch potential NO_DATA_FOUND exception and continue BEGIN SELECT EMPLOYEE_NAME INTO l_empoyee_name FROM EMPLOYEES WHERE EMPLOYEE_ID = 12345; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN RAISE; END; do_stuff(); EXCEPTION WHEN OTHERS THEN -- Propagate exception RAISE; END;
請注意,PL / SQL通常不允許從Visual Basic知道的“錯誤恢復繼續”型別的異常處理,其中所有異常都被忽略,並且程式繼續執行,就好像沒有發生任何事情一樣(參見ofollow,noindex" target="_blank">On error resume next type of error handling in PL/SQL oracle ).您需要在巢狀塊中明確地包含潛在的失敗語句.
2)你的程式是不重要的,忽略它丟擲的所有異常不會影響你的主程式邏輯. (但是,這種情況很少,經常會導致長期的除錯噩夢)
BEGIN do_stuff(); EXCEPTION WHEN OTHERS THEN -- Ignore all exceptions and return control to calling block NULL; END;
http://stackoverflow.com/questions/27566867/pl-sql-exception-handling-do-nothing-ignore-exception