oracle developer的異常處理機制
oracle developer以其快速的資料處理開發而聞名,其異常處理機制也是比較完善,不可小覷。
1、 異常的優點
如果沒有異常,在程式中,應當檢查每個命令的成功還是失敗,如
begin
select ...
-- check for 』no data found』 error
select ...
-- check for 』no data found』 error
select ...
-- check for 』no data found』 error
這種實現的方法缺點在於錯誤處理沒有與正常處理分開,可讀性差,使用異常,可以方便處理錯誤,而且異常處理程式與正常的事務邏輯分開,提高了可讀性,如
begin
select ...
select ...
select ...
...
exception
when no_data_found then -- catches all 』no data found』 errors
2、 異常的分類
有兩種型別的異常,一種為內部異常,一種為使用者自定義異常,內部異常是執行期間返回到pl/sql塊的oracle錯誤或由pl/sql**的某操作引起的錯誤,如除數為零或記憶體溢位的情況。使用者自定義異常由開發者顯示定義,在pl/sql塊中傳遞資訊以控制對於應用的錯誤處理。
每當pl/sql違背了oracle原則或超越了系統依賴的原則就會隱式的產生內部異常。因為每個oracle錯誤都有乙個號碼並且在pl/sql中異常通過名字處理,oracle提供了預定義的內部異常。如select into 語句不返回行時產生的oracle異常no_data_found。對於預定義異常,現將最常用的異常列舉如下:
exception oracle error sqlcode value condition
no_data_found ora-01403 +100 select into 語句沒有符合條件的記錄返回
too_mang_rows ora-01422 -1422 select into 語句符合條件的記錄有多條返回
dup_val_on_index ora-00001 -1 對於資料庫表中的某一列,該列已經被限制為唯一索引,程式試圖儲存兩個重複的值
value_error ora-06502 -6502 在轉換字元型別,擷取或長度受限時,會發生該異常,如乙個字元分配給乙個變數,而該變數宣告的長度比該字元短,就會引發該異常
storage_error ora-06500 -6500 記憶體溢位
zero_divide ora-01476 -1476 除數為零
case_not_found ora-06592 -6530 對於選擇case語句,沒有與之相匹配的條件,同時,也沒有else語句捕獲其他的條件
cursor_already_open ora-06511 -6511 程式試圖開啟乙個已經開啟的游標
timeout_on_resource ora-00051 -51 系統在等待某一資源,時間超時
如果要處理未命名的內部異常,必須使用others異常處理器或pragma exception_init 。pragma由編譯器控制,或者是對於編譯器的注釋。pragma在編譯時處理,而不是在執行時處理。exception_init告訴編譯器將異常名與oracle錯誤碼結合起來,這樣可以通過名字引用任意的內部異常,並且可以通過名字為異常編寫一適當的異常處理器。
在子程式中使用exception_init的語法如下:
pragma exception_init(exception_name-oracle_error_number);
在該語法中,異常名是宣告的異常,下例是其用法:
declare
deadlock_detected exception;
pragma exception_init(deadlock_detected-60);
begin
... -- some operation that causes an ora-00060 error
exception
when deadlock_detected then
-- handle the error
end;
對於使用者自定義異常,只能在pl/sql塊中的宣告部分宣告異常,異常的名字由exception關鍵字引入:
reserved_loaned exception
產生異常後,控制傳給了子程式的異常部分,將異常轉向各自異常控制塊,必須在**中使用如下的結構處理錯誤:
exception
when exception1 then
sequence of statements;
when exception2 then
sequence of statements;
when others then
3、異常的丟擲
由三種方式丟擲異常
1.通過pl/sql執行時引擎
2. 使用raise語句
當資料庫或pl/sql在執行時發生錯誤時,乙個異常被pl/sql執行時引擎自動丟擲。異常也可以通過raise語句丟擲
raise exception_name;
顯式丟擲異常是程式設計師處理宣告的異常的習慣用法,但raise不限於宣告了的異常,它可以丟擲任何任何異常。例如,你希望用timeout_on_resource錯誤檢測新的執行時異常處理器,你只需簡單的在程式中使用下面的語句:
raise timeout_on_resouce;
比如下面乙個訂單輸入的例子,若當訂單小於庫存數量,則丟擲異常,並且捕獲該異常,處理異常
declare
inventory_too_low exception;
---其他宣告語句
begin
if order_rec.qty>inventory_rec.qty then
raise inventory_too_low;
end if
exception
when inventory_too_low then
order_rec.staus:='backordered';
end;
python python try異常處理機制
python的try語句有兩種風格 一 種是處理異常 try except else 二 種是無論是否發生異常都將執行最後的 try finally try except else風格 try 語句 執行別的 except 名字 語句 如果在try部份引發了 name 異常 except 名字 資料...
使用springboot的全域性異常處理機制
這是我第一次學習使用spring boot全域性異常處理機制,分享一點兒經驗給大家 controlleradvice public class globalexceptionhandler else 輸出異常的堆疊資訊 exception.printstacktrace 構造錯誤返回值 string...
異常處理機制
異常處理的三個步驟 檢查異常,丟擲異常,處理異常 異常處理基本原理 把需要檢測的程式放到try塊中,把異常處理的程式放在catch塊中。如果執行乙個函式出現了異常,可以丟擲異常資訊。然後查詢try塊下面的catch塊是否可以處理該異常。如果該函式不處理該異常,將傳遞給它的上一級函式 呼叫函式 如果它...