2013-06-25 66 views
2

我想扔應用程序錯誤創建程序。這個程序應該放在單獨的程序包中。甲骨文 - 「記錄」不斷

procedue Raise_Error(error_code) is 
err t_Error; 
begin 
     err:= error_list(error_code); 
     raise_application_error(err.error_number, err.message); 
end; 

所以我創建了包內的類型:

我怎麼能這樣創建錯誤常量的列表:

const1 t_Error := t_Error (-200001, 'first message'); 
const2 t_Error := t_Error (-200002, 'second message'); 

error_list ('code1') := const1; 
error_list ('code2') := const2; 

非常感謝。 鮑勃

回答

1

您可以創建在軟件包的begin/end塊(其中將用於調用包中的每個會話創建)錯誤表,但你不能實例化一個這樣的記錄;你需要獨立設置字段值:

create package body error_pkg as 
    procedure Raise_Error(error_code in varchar2) is 
    err t_Error; 
    begin 
    err := error_list(error_code); 
    raise_application_error(err.error_number, err.message); 
    end Raise_Error; 

begin 
    error_list ('code1').error_number := -20001; 
    error_list ('code1').message := 'first message'; 
    error_list ('code2').error_number := -20002; 
    error_list ('code2').message := 'second message'; 
end error_pkg; 
/

與虛擬PL/SQL塊調用程序:

begin 
    error_pkg.raise_error('code2'); 
end; 
/

Error report: 
ORA-20002: second message 
ORA-06512: at "STACKOVERFLOW.ERROR_PKG", line 6 
ORA-06512: at line 2 

SQL Fiddle demo

我不知道這是雖然是個好主意。你失去原來的問題的堆棧跟蹤 - 你不知道在哪裏raise_error呼叫製成。也許這對你自己的錯誤並不重要;但如果你正在捕捉一個真正的異常並調用它,那將是一個糟糕的主意。

+1

完整堆棧跟蹤保持相同,只是在上SQLFIddle你的例子檢查輸出:'ORA-20002:第二消息[...跳過...]在第2行:開始error_pkg.raise_error( '代碼2');結束;'。即錯誤的來源很容易確定。從我的觀點來看,在整個項目中維護一致的錯誤列表是很好的方法,但是使用常量來定義錯誤代碼是有爭議的。 – ThinkJet

+1

@ThinkJet - 是的,我主要是擔心這是從一個異常處理函數中調用,但並沒有解釋得非常好;無論如何也沒有真正的理由去想。 –

+0

@Alex_Poole好的。我分享你的擔憂,尤其是因爲就在昨天,我面臨着一個程序員攔截系統錯誤並將其作爲業務級錯誤呈現的情況。這種誤解導致沒有任何關於錯誤來源的信息。因此,這種模式的使用必須有詳細的記錄,並且它的使用必須在開發團隊的所有成員中執行。 – ThinkJet