DECLARE
string_of_5_chars VARCHAR2(5);
BEGIN
BEGIN
string_of_5_chars := 'Steven';
EXCEPTION
WHEN value_error THEN
RAISE no_data_found;
WHEN no_data_found THEN
dbms_output.Put_line ('Inner block');
END;
EXCEPTION
WHEN no_data_found THEN
dbms_output.Put_line ('Outer block');
END;
答案说输出将是“外部块”,有人可以解释为什么内部块不会被执行吗? oracle
中异常的优先级是什么答案 0 :(得分:9)
DECLARE
string_of_5_chars VARCHAR2(5);
BEGIN
BEGIN
string_of_5_chars := 'Steven'; -- Varchar has a size of 5 defined above. So it will throw a value_error(due to size constraints) exception.
EXCEPTION
WHEN value_error THEN -- This exception block will handle the error thrown above.
RAISE no_data_found; -- It raises a no_data _found exception which by rule has to be handled in the outer exception block. So it goes to the outer exception block.
WHEN no_data_found THEN
dbms_output.Put_line ('Inner block');
END;
EXCEPTION
WHEN no_data_found THEN
dbms_output.Put_line ('Outer block'); -- Exception is handled here which causes it to print 'Outer Block'
END;
阅读here以获取有关嵌套异常块的更多信息。
答案 1 :(得分:2)
您应该将异常块的WHEN子句视为与常规CASE语句类似。执行匹配条件的第一个WHEN,并跳过该异常处理程序中的以下WHEN子句。
因此,内部异常块中的第二个WHEN子句根本不在代码执行路径中,外部异常块捕获由嵌套异常的第一个WHEN子句引发的no_data_found错误。
此方案中的异常传播在此解释:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm#LNPLS00706
答案 2 :(得分:0)
当string_of_5_chars := 'Steven';
引发value_error
时,会输入相应的异常块
在异常块内部引发no_data_found
异常。由于提升部分,此异常由外部块的异常处理处理。
有关详细信息,请查看http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/raise_statement.htm