DECLARE
null_salary EXCEPTION;
PRAGMA EXCEPTION_INIT (null_salary, -20101);
BEGIN
RAISE_APPLICATION_ERROR(-20101,'有异常a');
EXCEPTION
WHEN null_salary THEN
dbms_output.put_line('b');
RAISE_APPLICATION_ERROR(-20101,'有异常b');
END;
这样输出异常b会执行exception中的代码。为什么会忽略异常a呢?
DECLARE
null_salary EXCEPTION;
PRAGMA EXCEPTION_INIT (null_salary, -20101);
BEGIN
RAISE_APPLICATION_ERROR(-20103,'有异常a');
EXCEPTION
WHEN null_salary THEN
dbms_output.put_line('b');
RAISE_APPLICATION_ERROR(-20101,'有异常b');
END;
这样会输出异常a,但是这个异常是没有预先定义的。请问代码1段的那种情况怎么合理的避免或者运用呢?这种值栈当中的覆盖会引起逻辑上的混乱吗?如果我不小心抛出了同样的异常是会引起exception的代码能执行,这种情况在开发中有办法避免吗吗?
关于Oracle的异常处理
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 你知我知皆知 2024-08-03 10:47关注
以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
在 Oracle 中,
RAISE_APPLICATION_ERROR
语句用于向应用程序报告一个错误,并且它将自动触发null_salary
异常。这是由于 Oracle 的事务处理机制和异常处理策略。当你使用
PRAGMA EXCEPTION_INIT
来初始化null_salary
异常时,你实际上是在告诉 Oracle 在发生特定类型的异常时如何响应。然而,在你的例子中,当你尝试捕获null_salary
异常并打印出 "b" 后,Oracle 将不会再次触发null_salary
异常,因为这已经发生了。如果你想要让程序在捕获到
null_salary
异常后继续运行,你可以考虑以下几种方法:- 使用
DBMS_APPLICATION_EXCEPTIONS
提供的异常处理功能。例如,你可以设置一个全局变量来跟踪当前正在处理的异常类型,然后根据这个变量来决定是否继续执行后续操作。 - 如果你想让程序在遇到多个相同的异常时仍然能够正常运行,可以考虑使用异常链(Exception Chains)或异常队列(Exception Queues)。这些技术允许程序在遇到多个相同异常时保持一致性,而不需要重新启动整个应用。
至于
null_salary
是否会导致值栈中的覆盖引起逻辑混乱的问题,通常情况下不会。但在某些情况下,如果null_salary
异常的上下文非常复杂,可能会导致问题。例如,如果你有一个复杂的数据库查询并且你在其中抛出了null_salary
异常,那么在执行查询的过程中可能会引发更多的异常,从而导致问题。在这种情况下,你需要确保所有可能的异常都被正确地捕获和处理。总之,
null_salary
异常在 Oracle 中默认被忽略的原因是因为它的行为与其他常见的异常不同。为了防止这种混淆,请确保理解Oracle的异常处理策略,并根据具体情况进行适当的配置。解决 无用评论 打赏 举报 - 使用
悬赏问题
- ¥15 非科班怎么跑代码?如何导数据和调参
- ¥15 福州市的全人群死因监测点死亡原因报表
- ¥15 打开powerpont询问是否安装officeplus不小心点了不安装以后再也不提示是否安装了
- ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
- ¥15 系统2008r2 装机配置推荐一下
- ¥500 服务器搭建cisco AnyConnect vpn
- ¥15 用大厂网站防红自己网站
- ¥15 悬赏Python-playwright部署在centos7上
- ¥15 psoc creator软件有没有人能远程安装啊
- ¥15 快速扫描算法求解Eikonal方程咨询