测试异常块的失败过程

时间:2012-12-24 09:35:21

标签: sql oracle exception plsql procedures

我正在测试几个正在生产的程序,并在异常块中添加了一些部分。我在测试环境中制作了这些程序的副本,我需要为测试提出异常。

什么是简单方法或最小代码更改,以使过程进入异常块?

我们在异常块中只有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;

我做错了什么?

2 个答案:

答案 0 :(得分: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到20,999之间的例外情况,因此请确保使用此范围内的数字。

一个例子可能是:

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;

答案 1 :(得分:2)

要引发异常,请使用以下代码:

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

Oracle文档:Handling PL/SQL Errors