2012-12-24 101 views
0

我正在測試幾個正在生產並在異常塊中添加了一些部分的過程。我在測試環境中製作了這些過程的副本,我需要提出一個測試異常。測試異常塊的失敗過程

什麼是簡單的方法或使用最少的代碼更改,使程序進入異常塊?

我們只有others在我們捕捉所有異常的異常塊中。例如:

DECLARE 
    -- something 
BEGIN 
    -- I need some operation to do here which will make control go to exception 
EXCEPTION 
    WHEN others THEN 
     -- handling error (Need to check these changes) 
END; 

我創建了一個程序來測試控制流程,以防異常但它給我錯誤。代碼如下

CREATE OR REPLACE Procedure Exception_Check 
AS 
BEGIN 

    dbms_output.put_line('step 1..........'); 
    raise_application_error(-20111, 'Step 2...........'); 
    dbms_output.put_line('step 3..........'); 


EXCEPTION 
WHEN OTHERS THEN 
    dbms_output.put_line('step 4, In to the exception block..........'); 
    raise_application_error(-20112, 'Step 5........... In raising application error'); 
END; 

我做錯了什麼?

+0

@mari,[這](http://stackoverflow.com/review/suggestions-edits/1231025)不是一個好的建議編輯。請[不要添加隨機語法高亮顯示](http://meta.stackexchange.com/questions/137755/reject-an-already-approved-suggested-edit-when-rolling-it-back);這是不必要的,並使帖子更難以閱讀。只能使用反引號代碼,而不能使用關鍵字。 – Ben

+0

@Ben,感謝您的反饋!將遵循!! 1 – Mari

+1

你的程序是_meant_給你一個錯誤。這是程序的全部要點。 [如果你看看輸出](http://www.sqlfiddle.com/#!4/52205/1)這是錯誤代碼20112,這是你正在提出的錯誤。 – Ben

回答

4

一開始使用EXCEPTION WHEN OTHERS醒目一切不一定是最好的做法。如果你處理一個異常,你應該確切地知道你將如何處理它。你不太可能有能力使用OTHERS正確處理每一個Oracle異常,如果你這樣做了,你應該把它們記錄在某個他們會被注意的地方。

從Oracle的Guidelines for Avoiding and Handling Exceptions報價:

  • 只要有可能,編寫異常處理程序命名例外,而不是使用OTHERS異常處理程序。

    瞭解預定義例外的名稱和原因。如果您知道您的數據庫操作可能會引發特定的內部 定義的沒有名稱的異常,請爲它們指定名稱,以便您可以專門爲它們編寫異常處理程序 。

要回答你的問題,你可以使用raise_application_error程序在你的代碼的任何一點引發錯誤:

RAISE_APPLICATION_ERROR (-20000, 'an exception'); 

用戶定義的例外是那些20,000至20999之間,保證您在這個範圍內使用一個數字。

一個例子可以是:

begin 

    raise_application_error(-20500, 'an exception occurred'); 

exception when others then 
    do_something; 
end; 
/

您也可以定義自己的pre-defined exception,然後你就可以趕上:

declare 
    my_exception EXCEPTION; 
    PRAGMA EXCEPTION_INIT(my_exception, -20001); 
begin 
    raise_application_error(-20001, 'an exception'); 
exception when my_exception then 
    do_something; 
end; 
2

引發異常使用此代碼:

raise_application_error(-20111, 'Custom error message'); 

Oracle文檔:Handling PL/SQL Errors

+0

這是在我的異常塊,但我需要去程序異常塊 –

+0

@PravinSatav - 不,他的意思是將此添加到*你的程序*迫使他們進入例外區塊。 – APC

+0

如果在BEGIN之後插入raise_application_error(-20111,'Custom error message'),您將轉到EXCEPTION塊。 –

相關問題