[英]Cannot handle raised exception in PL/SQL
如果找不到行,我會嘗試處理異常。 結果我看到以下錯誤: PL/SQL: unhandled user-defined exception. A user-defined exception was raised by PL/SQL code, but not handled.
PL/SQL: unhandled user-defined exception. A user-defined exception was raised by PL/SQL code, but not handled.
我做錯了什么?
DECLARE
my_exception EXCEPTION;
result1 VARCHAR2(50);
result2 NUMBER;
BEGIN
SELECT brand, year INTO result1, result2 FROM cars WHERE car_id=200;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE my_exception; WHEN my_exception THEN
DBMS_OUTPUT.PUT_LINE('Exception has been thrown');
END;
引發NO_DATA_FOUND
異常時,已經調用了外部塊中的異常處理程序。 如果您在異常處理塊中引發另一個異常,那么它不會在同一級別被捕獲; 相反,您要么需要:
RAISE
語句包裝在它自己的 PL/SQL 匿名塊中,並在該塊的異常處理程序中捕獲異常:DECLARE
my_exception EXCEPTION;
result1 VARCHAR2(50);
result2 NUMBER;
BEGIN
SELECT brand, year INTO result1, result2 FROM cars WHERE car_id=200;
EXCEPTION
WHEN NO_DATA_FOUND THEN
BEGIN
RAISE my_exception;
EXCEPTION
WHEN my_exception THEN
DBMS_OUTPUT.PUT_LINE('Exception has been thrown');
END;
END;
/
DECLARE
my_exception EXCEPTION;
BEGIN
DECLARE
result1 VARCHAR2(50);
result2 NUMBER;
BEGIN
SELECT brand, year INTO result1, result2 FROM cars WHERE car_id=200;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE my_exception;
END;
EXCEPTION
WHEN my_exception THEN
DBMS_OUTPUT.PUT_LINE('Exception has been thrown');
END;
/
這兩個 output:
Exception has been thrown
您已成功捕獲 NO_DATA_FOUND 異常,但在該異常處理程序中,您隨后引發了您自己的新用戶定義異常 (RAISE my_exception)。
當您從這樣的異常處理程序中引發時,它會回退到父塊並在那里尋找異常處理程序……但是您沒有父塊,依此類推,直到它到達最外層的塊。 如果沒有被捕獲,它最終會向客戶端拋出“未處理的用戶自定義異常”。
如果您想繼續執行並且只發出該 dbms_output 消息,則刪除“RAISE my_exception”行以及與該異常有關的所有內容。 只需將 dbms_output 放入 NO_DATA_FOUND 的處理程序中。
但是,如果你真的想使用用戶定義的異常,那么將整個東西嵌套在一個包裝父塊中並在那里處理它:
DECLARE
my_exception exception;
BEGIN
DECLARE
result1 VARCHAR2(50);
result2 NUMBER;
BEGIN
SELECT brand, year INTO result1, result2 FROM cars WHERE car_id=200;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE my_exception;
END;
EXCEPTION
WHEN my_exception THEN
dbms_output.put_line("my_exception raised")
END;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.