我在Oracle网站上发现了这篇文章:Managing Exceptional Behavior, Part 1。
在其中,有人定义了一个错误包,包括提升,处理,报告和转发,报告,停止和记录的程序。可以在此处找到此软件包的细目:errpkg。
我感兴趣的部分在这里:
IF l_errcode BETWEEN -20999 AND -20000 THEN
raise_application_error (l_errcode, l_errmsg);
/* Use positive error numbers -- lots to choose from! */
ELSIF l_errcode > 0 AND l_errcode NOT IN (1, 100) THEN
raise_application_error (-20000, l_errcode || '-' || l_errmsg);
/* Can't EXCEPTION_INIT -1403 */
ELSIF l_errcode IN (100, -1403) THEN
RAISE NO_DATA_FOUND;
/* Re-raise any other exception. */
ELSIF l_errcode != 0 THEN
EXECUTE IMMEDIATE
'DECLARE myexc EXCEPTION; ' ||
' PRAGMA EXCEPTION_INIT (myexc, ' || TO_CHAR (err_in) || ');' ||
'BEGIN RAISE myexc; END;';
END IF;
该片段的粘贴方式与文章中的内容完全相同。我相信第一个if
语句覆盖了所有用户错误,因为-209999到-20000是为用户创建的异常保留的。
在第一个elsif
语句中(错误代码> 0而不是(1,00)),根据文章,代码正在执行以下操作:
我还处理特定于应用程序的错误的正数 数字。通过处理正面的错误消息编号,我不是 一些,约束在-20,999和-20,000之间的错误数 Oracle也使用它(虽然我远离1和100,唯一 Oracle确实使用的两个正误差数。)
所以对我而言,听起来他很高兴在150,160,170等代码中声明错误,前提是它们不会发生在1到100之间。
然而,该程序的下两部分是做什么的?什么是(100,-1403)中的错误代码?我可以看到它与错误代码01403(未找到数据)有关,但我不理解它在括号(100,-1403)中的位置。什么是立即执行的最终elsif?我正在努力想知道它的目的是什么。
答案 0 :(得分:4)
如前所述in the exception_int
documentation,Oracle可以同时使用-1403和+100来查找未找到的数据'它也在precompiler manuals中提到过; +100用于ANSI模式。所以IN (100, -1403)
只是覆盖了没有找到数据时引发的错误的两个可能值。
最后一部分似乎是声明并立即提出了一个命名异常。您只能将raise application error
与-20000范围的错误代码一起使用,因此这允许引发内置异常,而无需为所有可能的错误解释或声明编译指示。 no_data_found
被明确处理,因为它有两个错误代码,因此调用者可以获得一致的错误,无论哪一个实际发生,大概是。
我很难理解为什么你会使用错误包来解决这个问题 - 这篇文章似乎主张用when others
进行捕获,然后使用这种机制来引发一个新的异常相同的代码;这将失去堆栈跟踪。我不明白为什么那会比原来的异常泡沫更自然地好起来。
答案 1 :(得分:0)
l_errcode IN (100, -1403)
是l_errcode = 100 OR l_errcode = -1403
的缩写形式。它可以是任何顺序,l_errcode IN (-1403, 100)
具有完全相同的结果。 100和-1403都是没有找到数据的错误代码。
具有execute immediate的最终elsif引发了一个带有用户定义错误消息的异常。需要将用户定义的异常与错误代码EXCEPTION_INIT
关联起来:https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/exceptioninit_pragma.htm