我正在测试几个正在生产的程序,并在异常块中添加了一些部分。我在测试环境中制作了这些程序的副本,我需要为测试提出异常。
什么是简单方法或最小代码更改,以使过程进入异常块?
我们在异常块中只有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 :(得分: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