分類,三類異常 1.預定義異常 Oracle預定義的異常,有24個,對這種異常的處理無需在程式中定義,由Oracle自動引發。 2.非預定義異常 其他標準的Oracle異常,對這種異常的處理,需用戶在程式中定義,然後由Oracle自動將其引發。非預定義的異常只有編號沒有名稱。 3.用戶定義異常 由用 ...
分類,三類異常
1.預定義異常
Oracle預定義的異常,有24個,對這種異常的處理無需在程式中定義,由Oracle自動引發。
2.非預定義異常
其他標準的Oracle異常,對這種異常的處理,需用戶在程式中定義,然後由Oracle自動將其引發。非預定義的異常只有編號沒有名稱。
3.用戶定義異常
由用戶在程式自定義的異常,當出現某種用戶認為的非正常情況時,顯式地在程式中將其引發。
拋出方式,三種
1.系統在運行時自動拋出
2.通過raise語句拋出,拋出的異常為已定義有名字的;
3.調用raise_application_error存儲過程拋出異常,可直接拋出異常代碼和異常消息;
非預定義異常
1.在聲明部分聲明異常情況
異常情況(異常名) EXCEPTION;
2.將聲明好的異常與標準的Oracle錯誤聯繫起來,使用EXCEPTION——INIT
PRAGMA EXCEPTION_INIT(異常情況(異常名),錯誤代碼);
3.在程式塊的異常處理部分對異常做相應處理。
在EXCEPTION塊中做處理。
註:預定義的異常也可通過這種方式修改名稱。
處理未命名的異常(非預定義)必須使用OTHERS處理或者用PRAGMA為異常確定名稱;
用戶自定義的異常
1.在聲明部分聲明異常情況
語法:
異常情況(異常名) EXCEPTION;
2.通過raise語句觸發。手動拋出異常。
語法:
raise 異常情況(異常名);
3.在程式塊的異常處理部分對異常做相應處理。
在EXCEPTION塊中做處理。
若自定義的異常拋出後沒有在EXCEPTION中處理,會報“用戶自定義的異常錯誤未得到處理”的錯誤。
處理異常
Oracle的異常處理在EXCEPTION中,一般放在程式體的後半部分,捕獲異常的結構為
EXCEPTION
when 異常名1 then
處理過程
when 異常名2 then
..............
when OTHERS then
..........
END;
ps:1.others表示其他所有的異常.
2.在異常處理的代碼塊()中可用到這兩個關鍵字。
SQLcode:返回錯誤號;
SQLERRM:返回錯誤信息;
函數raise_application_error()
用來拋出異常消息,可將異常傳給客戶端的應用程式。前臺收到的消息包含異常代碼和異常說明。
包含三個參數:
第一個參數(error_number)自定義異常的代碼,取值範圍為-20000到-20999之間。
第二個參數(error_message)為異常的說明,長度最大為2k位元組,超過2k就截取。
第三個參數(keep_errors)為可選參數,true表示將新錯誤添加到已經引發的錯誤列表中,false(預設)表示新錯誤替換當前的錯誤列表,即值為true時列印整個異常列表。
例:raise_application_error(-20001,'無記錄或記錄已失效');
例:聲明並處理拋出的自定義異常
DECLARE
deadlock_detected EXCEPTION; --聲明自定義異常
PRAGMA EXCEPTION_INIT(deadlock_detected, -60); --綁定異常代碼
BEGIN
... -- Some operation that causes an ORA-00060 error
--系統執行過程中自動拋出或使用raise拋出;
EXCEPTION
WHEN deadlock_detected THEN
-- handle the error --處理異常,常用方法為異常信息寫入日誌,再將異常用raise_application_error()傳給客戶端的應用程式;
END;