OracleException异常处理:掌握这些技巧不再烦恼

吉云

今天得跟大家聊聊我在捣鼓Oracle数据库时碰到异常(就是那个`OracleException`)的一些经历和处理过程。写代码嘛总不能指望它一直顺顺当当地跑,不出点幺蛾子是不可能的。尤其是在跟数据库打交道的时候,各种情况都可能发生。

初遇难题

一开始我写段PL/SQL代码,用来处理一些业务数据。逻辑自我感觉良觉得跑起来应该没啥问题。结果一执行,有时候就直接报错中断,抛给我一堆看不大懂的ORA-错误代码。这下用户那边就炸锅,说系统动不动就崩溃。我自己排查起来也头疼,错误信息不直观,有时候得猜半天。

OracleException异常处理:掌握这些技巧不再烦恼

意识到问题所在

我就琢磨着,这样不行。程序不能这么脆弱,遇到点小问题就直接“躺平”。总得想个办法,在出错的时候能优雅地处理一下,至少告诉用户发生什么,或者在后台悄悄记个日志,方便我回头去修。

摸索处理方法

于是我就开始研究Oracle里怎么处理这种错误。发现PL/SQL里头专门有个叫“异常处理”的机制。简单说,就是在你的代码块(比如一个存储过程或者函数)的末尾,加一个`EXCEPTION`区域,专门用来捕捉和处理运行时可能发生的错误。

我解到主要有几种情况:

    OracleException异常处理:掌握这些技巧不再烦恼

  • 系统预定义的异常: 就是Oracle自己已经定义好名字的一些常见错误,比如查数据没查到 (`NO_DATA_FOUND`),或者`SELECT INTO`语句返回多行数据 (`TOO_MANY_ROWS`)。这些是最常见的,可以直接抓。
  • 非预定义的Oracle异常: 就是其他的Oracle错误,虽然有ORA-错误号,但是没给预定义的名字。这种也需要处理。
  • 我自己定义的异常: 有时候错误不是数据库层面的,而是业务逻辑上的问题。比如,我想检查库存,如果库存不足,这在数据库看来不是错,但在我的业务上是。这时候就得自己定义一个异常,然后在代码里手动触发它。

动手实践

知道这些,我就开始动手改我的代码。

OracleException异常处理:掌握这些技巧不再烦恼

我在我的PL/SQL代码块加上`EXCEPTION`关键字。然后是`WHEN`语句。

处理常见错误: 比如,我有一段代码是根据ID查一条记录放到变量里,我就加:

WHEN NO_DATA_FOUND THEN
-- 这里写处理逻辑,比如记日志说“没找到对应ID的数据”,或者给个默认值
DBMS_*_LINE('警告:没有找到数据!');

WHEN TOO_MANY_ROWS THEN
-- 这里也一样,记录日志说“找到多条数据,不符合预期”
DBMS_*_LINE('错误:查询返回多行!');

处理其他所有Oracle错误: 为防止有没预料到的Oracle错误导致程序崩溃,我加一个“兜底”的处理:

WHEN OTHERS THEN
-- 这个很重要,能抓住所有上面没单独处理的Oracle错误
-- 在这里,我通常会记录下具体的错误号(SQLCODE)和错误信息(SQLERRM)
v_error_code := SQLCODE;
v_error_msg := SUBSTR(SQLERRM, 1, 200);
-- 把 v_error_code 和 v_error_msg 存到日志表或者打印出来
DBMS_*_LINE('发生未知数据库错误:' v_error_code ' - ' v_error_msg);
-- 可能还需要向上抛出异常或者返回一个错误状态

OracleException异常处理:掌握这些技巧不再烦恼

处理自定义业务异常: 对于前面说的库存不足的例子,我是这么做的:

先在代码的声明部分定义一个自己的异常:

insufficient_stock EXCEPTION;

然后在检查库存的逻辑里,如果发现库存不够,就手动触发这个异常:

IF v_current_stock < v_required_stock THEN
RAISE insufficient_stock;
END IF;

在`EXCEPTION`区里捕捉这个自定义异常:

OracleException异常处理:掌握这些技巧不再烦恼

WHEN insufficient_stock THEN
-- 处理库存不足的情况,比如返回一个特定的错误码给调用者,或者记录业务日志
DBMS_*_LINE('业务错误:库存不足!');

测试和完善

加上这些异常处理后,我特意去模拟各种出错场景:故意传个不存在的ID让它`NO_DATA_FOUND`,修改数据让查询返回多行触发`TOO_MANY_ROWS`,模拟库存不足触发自定义异常,甚至还试些会引发其他ORA错误的骚操作。

结果就好多。程序不再轻易崩溃,遇到问题时,要么按我预设的逻辑处理,要么在日志里留下清晰的错误记录。这样排查问题就快多,用户体验也好一些,至少不会看到莫名其妙的ORA代码。

小结

折腾这个`OracleException`的处理过程,虽然花我点时间去学习和修改代码,但效果是实实在在的。代码的健壮性大大提高。现在我写新的PL/SQL代码,都会习惯性地加上异常处理块,把能预见到的问题先处理掉,再用`WHEN OTHERS`来兜底。这算是我实践中总结出来的一个挺重要的经验,分享给大家,希望有点用。

OracleException异常处理:掌握这些技巧不再烦恼

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]