2011-09-09 104 views
1

這是一個關於最佳實踐的問題。我有類似這樣程序中的PL/SQL異常處理

DECLARE 

    --work variables 

    PROCEDURE p1(in_parameter1, out_parameter1, out_parameter2...) IS 
    BEGIN  
     --do stuff 
     --select (...) into (...) from t1 where (...) 
    END; 

    PROCEDURE p2(in_parameter1, out_parameter1, out_parameter2...) IS 
    BEGIN 
     --do stuff 
     --insert/update tables 
     --do more stuff 
    END;  

BEGIN -- MAIN PROCESS STARTS HERE 

    open c1; 
    fetch c1 into c1RowData; 
    EXIT WHEN c1%NOTFOUND  
    --call procedure1 
    --do stuff 
    --call procedure2 
    --do stuff 
    --do stuff 
    --call procedure1 
    --call procedure2 
END; 
/
EXIT; 

手續P1和P2語句的PL/SQL塊也可能引發異常(NO_DATA_FOUND,DUP_VAL_ON_INDEX,...)。

您認爲處理這些異常的最佳方法是什麼?是否應該在程序中處理它們,或者您是否認爲我應該將TRY-CATCH塊的主體程序包含在每個調用中?

回答

6

就我個人而言,我會在他們被拋出的程序中捕獲它們。這意味着您可以更好地控制外部處理方式。例如,您可以再次拋出它們作爲用戶定義的異常,您可以使用更多關於錯誤的更多信息進行修改。

'Failed to find a matching row in table a for value b' 

'no data found' 

程序之外更多的描述不過這真的取決於:調用應用程序

  • 實際功能實現的

    1. 錯誤報告要求在程序內你做'東西'

    例如,假設你想運行的程序2,即使選擇在步驟1中沒有行..你需要趕上步驟1中的異常並忽略它。如果你沒有,那麼它會是在程序拋出異常處理程序2.

    或者說你想步驟1在選擇沒發現什麼情況下插入一行,在這種情況下,您需要捕獲異常並在異常處理程序中執行插入操作。

    現在,任何人在我面前跳,我不建議你使用異常處理程序contrlling代碼中執行的流程,這些例子都是理論上的,但希望你的想法..

  • +0

    謝謝!你說這取決於「實際的功能實施(..)在程序中「,請您詳細說明一下,在哪種情況下最好處理程序之外的異常情況? – bruno

    1

    最好在程序內處理異常。這將很快結束。不僅如果我們在一些其他函數中重複使用相同的過程,我們也不需要處理異常。我的觀點是,程序內部的異常處理本身是最好的。

    +0

    你能解釋一下「這將導致快」? – Sathya

    3

    你應該盡力在源頭處理異常(即在引發異常的程序中)。這使您可以更好地報告發生問題的位置,並且通常能夠更好地糾正問題,而無需向用戶傳遞令人討厭的Oracle錯誤消息。

    當然,如果您真的需要,您可以處理錯誤並重新提升它,但是如同StevieG回答的那樣,您還可以提出用戶定義的異常,這些異常通常是更具體的應用程序,對用戶/其他PL/SQL更有幫助碼。

    上有自定義錯誤的ASKTOM討論處理在這裏: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4684561825338