我是靠谱客的博主 大力菠萝,最近开发中收集的这篇文章主要介绍3、存储过程(PLSQL块)异常的传播1、异常的传播 2、声明部分与异常处理部分异常的传播3、异常处理的基本原则,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、异常的传播

当PL/SQL块的执行部分产生异常后,根据当前语句块以 及其外层语句块是否有该异常的处理器,异常传播方式分为下 列三种情况:

如果当前语句块有该异常的处理器,则程序流程转移到 该异常处理器,并进行异常处理。然后,程序的控制流程传递 到外层语句块,继续执行。

如下:
-- Created on  by Hj 
declare 
  v_code NUMBER(6);
  v_text VARCHAR2(200);
  test number ;
  e_test exception;--申明异常
  PRAGMA EXCEPTION_INIT(e_test,-2292);--ORA-02292 违反完整约束条件、已找到子记录
  i integer;
begin
begin
   i:=0;
   if i<=0 then
     raise e_test; --抛出异常
     end if ;
  test:=9/i;
  exception  --捕获异常
    when e_test then
       dbms_output.put_line('输入除数为0错误');
       end ;
          exception  --捕获异常
            when others then
              v_code:=SQLCODE;
              v_text:=SQLERRM;
              dbms_output.put_line('错误代码为'||v_code||'错误信息为'||v_text);

   
end;

输出如下:

 

如果当前语句块没有该异常的处理器,则通过在外层语 句块的执行部分重新产生该异常来传播该异常。然后,在外层 语句块的异常处理部分处理该异常。处理完异常后,程序的控 制流程继续向外部传递。

如下:

-- Created on  by Hj 
declare 
  v_code NUMBER(6);
  v_text VARCHAR2(200);
  test number ;
  e_test exception;--申明异常
  PRAGMA EXCEPTION_INIT(e_test,-2292);--ORA-02292 违反完整约束条件、已找到子记录
  i integer;
begin
begin
   i:=0;
   if i<=0 then
     raise e_test; --抛出异常
     end if ;
  test:=9/i;
  exception  --捕获异常
    when NO_DATA_FOUND then
       dbms_output.put_line('输入除数为0错误');
       end ;
          exception  --捕获异常
            when others then
              v_code:=SQLCODE;
              v_text:=SQLERRM;
              dbms_output.put_line('错误代码为'||v_code||'错误信息为'||v_text);

   
end;

 输出结果如下:

 

如果当前语句块及其外层语句块都没有对该异常的处 理,则该异常将传播到调用环境或主机环境。

 2、声明部分与异常处理部分异常的传播

与执行部分产生的异常传播方式不同,声明部分和异常处 理部分产生的异常会立刻传播到外层语句块的异常处理部分, 即使当前语句块有该异常的异常处理器也不会进行捕获处理。 如果外层语句块无法处理该异常,则异常继续向外传播,直到 调用环境或主机环境。 当外层语句块捕获并处理内层块的异常后,程序流程继续 向外层传递并执行。

BEGIN 
  DECLARE 
    v_number NUMBER(6):= 'ABC';
         BEGIN
             v_number:=1;
         EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('This is outputted by inner block');
       END; 
EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('This is outputted by outer block');
END;

 输出如下:

 

3、异常处理的基本原则

为了保证程序尽可能可靠与安全,编写PL/SQL程序时应 遵循下列原则:

        采用错误检验和异常处理相结合。对可能导致程序运行 错误的输入数据进行检查,避免输入数据不正确、实参为空 值、返回记录个数与预期不符等。

        在任何可能出现错误的地方添加异常处理器,包括算术 运算错误、字符串操作错误、数据库操作错误等,甚至是与程 序本身无关的错误,如磁盘存储、内存等硬件错误等。应该考虑这些可能错误的发生,保证程序正确执行。

        程序设计时要考虑数据库的状态与预期的状态不一致的 情况。例如,要查询的表结构发生变化,添加了新列、删除了 某些列或改变了某些列的数据类型等。为了保证程序的正常运行,定义标量时尽量使用%TYPE属性、定义记录类型变量时 尽量使用%ROWTYPE属性。

        不管何时,尽量通过异常名称捕获异常,针对特定的错 误进行处理。尽量少使用OTHERS异常处理器。

        异常处理器输出调试信息。如果要将调试信息保存在一 个独立的表中,最好在一个自治程序中完成该操作,这样即使 主程序中发生回滚操作也不影响调试信息的保存。

        在异常处理器中,要慎重决定当前事务是进行提交、回 滚还是继续执行。无论错误如何严重,都应该保持数据库的一 致性,避免存储不良数据。

        在最外层块的异常处理部分放置OTHERS异常处理器, 避免有未被处理的异常。在OTHERS异常处理器的最后使用 RAISE语句或调用RAISE_APPLICATION_ERROR过程。

最后

以上就是大力菠萝为你收集整理的3、存储过程(PLSQL块)异常的传播1、异常的传播 2、声明部分与异常处理部分异常的传播3、异常处理的基本原则的全部内容,希望文章能够帮你解决3、存储过程(PLSQL块)异常的传播1、异常的传播 2、声明部分与异常处理部分异常的传播3、异常处理的基本原则所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部