默認(rèn)情況下,SPL 程序中發(fā)生的任何錯(cuò)誤都會(huì)中止該程序的執(zhí)行。通過使用帶有 EXCEPTION 部分的 BEGIN 塊,您可以捕獲錯(cuò)誤并從中恢復(fù)。

其語(yǔ)法是 BEGIN 塊的常規(guī)語(yǔ)法的擴(kuò)展:

[ DECLARE
    declarations ]
  BEGIN
    statements
  EXCEPTION
    WHEN condition [ OR condition ]... THEN
      handler_statements
  [ WHEN condition [ OR condition ]... THEN
      handler_statements ]...
  END;

如果未發(fā)生錯(cuò)誤,這種形式的塊只執(zhí)行所有 statements,然后控制權(quán)將在 END 之后傳遞給下一個(gè)語(yǔ)句。如果在 statements 中發(fā)生錯(cuò)誤,則放棄對(duì) statements 的進(jìn)一步處理,并且控制權(quán)將傳遞給 EXCEPTION 列表。將在該列表中搜索與發(fā)生錯(cuò)誤匹配的第一個(gè) condition。如果找到匹配項(xiàng),則將執(zhí)行相應(yīng)的 handler_statements,然后控制權(quán)將在 END 之后傳遞給下一個(gè)語(yǔ)句。如果未找到匹配項(xiàng),則錯(cuò)誤會(huì)傳播出去,就好像 EXCEPTION 子句根本不存在一樣。帶 EXCEPTION 的封閉塊可能會(huì)捕獲錯(cuò)誤;如果沒有封閉塊,則會(huì)終止子程序的處理。

特殊的條件名稱 OTHERS 與每種錯(cuò)誤類型都匹配。條件名稱不區(qū)分大小寫。

如果在所選的 handler_statements 中發(fā)生新錯(cuò)誤,則它不能被此 EXCEPTION 子句捕獲,而是被傳播出去。周圍的 EXCEPTION 子句可捕獲它。

下表列出了可能使用的條件名稱:

條件名稱 說(shuō)明
CASE_NOT_FOUND 應(yīng)用程序遇到這樣一種情況:CASE語(yǔ)句中任何 case 的求值結(jié)果都不為TRUE,并且沒有ELSE條件。
COLLECTION_IS_NULL 應(yīng)用程序嘗試對(duì)空集合(如未初始化的嵌套表)調(diào)用集合方法。
CURSOR_ALREADY_OPEN 應(yīng)用程序嘗試打開已打開的游標(biāo)。
DUP_VAL_ON_INDEX 應(yīng)用程序嘗試存儲(chǔ)受約束列中當(dāng)前存在的重復(fù)值。
INVALID_CURSOR 應(yīng)用程序嘗試訪問未打開的游標(biāo)。
INVALID_NUMBER 應(yīng)用程序遇到數(shù)據(jù)異常(相當(dāng)于 SQLSTATE 類代碼 22)。INVALID_NUMBER是VALUE_ERROR的別名。
NO_DATA_FOUND 沒有符合選擇標(biāo)準(zhǔn)的行。
OTHERS 應(yīng)用程序遇到一個(gè)異常,該異常未被異常部分中的前提條件捕獲。
SUBSCRIPT_BEYOND_COUNT 應(yīng)用程序嘗試引用的嵌套表下標(biāo)或動(dòng)態(tài)數(shù)組超出其初始化或擴(kuò)展大小。
SUBSCRIPT_OUTSIDE_LIMIT 應(yīng)用程序嘗試引用下標(biāo)或嘗試將動(dòng)態(tài)數(shù)組擴(kuò)展到超出其最大大小限制。
TOO_MANY_ROWS 應(yīng)用程序遇到滿足選擇標(biāo)準(zhǔn)的多行(該標(biāo)準(zhǔn)中只允許返回一行)。
VALUE_ERROR 應(yīng)用程序遇到數(shù)據(jù)異常(相當(dāng)于 SQLSTATE 類代碼 22)。VALUE_ERROR是INVALID_NUMBER的別名。
ZERO_DIVIDE 應(yīng)用程序嘗試除以零。
User-defined Exception 請(qǐng)參見用戶定義的異常。
說(shuō)明 條件名稱 INVALID_NUMBER 和 VALUE_ERROR 與 Oracle 數(shù)據(jù)庫(kù)不兼容,對(duì)于 Oracle 數(shù)據(jù)庫(kù)來(lái)說(shuō),這些條件名稱僅用于因字符串轉(zhuǎn)換為數(shù)字文本失敗而導(dǎo)致的異常。此外,對(duì)于 Oracle 數(shù)據(jù)庫(kù),INVALID_NUMBER 異常只適用于 SQL 語(yǔ)句,而VALUE_ERROR 異常只適用于存儲(chǔ)過程語(yǔ)句。