簡體   English   中英

無法處理 PL/SQL 中引發的異常

[英]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異常時,已經調用了外部塊中的異常處理程序。 如果您在異常處理塊中引發另一個異常,那么它不會在同一級別被捕獲; 相反,您要么需要:

  1. 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;
/
  1. 將引發異常的塊包裝在外部塊中並在那里捕獲異常:
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM