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;

我在做什么错?

4

2 回答 2

4

首先,捕捉一切使用EXCEPTION WHEN OTHERS不一定是最佳实践。如果你处理一个异常,你应该确切地知道你将如何处理它。您不太可能有能力使用 OTHERS 正确处理每个 Oracle 异常,如果这样做,您可能应该将它们记录在会被注意到的地方。

引用 Oracle 的避免和处理异常指南

  • 尽可能为命名异常编写异常处理程序,而不是使用 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;
/

您还可以定义自己的预定义异常,然后可以捕获:

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;
于 2012-12-24T09:50:56.160 回答
2

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

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

Oracle 文档:处理 PL/SQL 错误

于 2012-12-24T09:44:37.243 回答