lennyyi 2015-03-02 03:39 采纳率: 0%
浏览 648

关于Oracle的异常处理


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的代码能执行,这种情况在开发中有办法避免吗吗?

  • 写回答

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 异常后继续运行,你可以考虑以下几种方法:

    1. 使用 DBMS_APPLICATION_EXCEPTIONS 提供的异常处理功能。例如,你可以设置一个全局变量来跟踪当前正在处理的异常类型,然后根据这个变量来决定是否继续执行后续操作。
    2. 如果你想让程序在遇到多个相同的异常时仍然能够正常运行,可以考虑使用异常链(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方程咨询