2011-09-09 71 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