PL/SQL每日一题:异常处理--WHEN子句

来源:互联网 发布:淘宝店铺第三层级 编辑:程序博客网 时间:2024/06/08 22:21

  题目

              捕获除数为零的错误("ORA-01476: divisor is equal to zero")并且在这种情况下显示 "Bad division"
              所有的其他异常都必须原封不动地传播到调用块
              换句话说,如果我加入下列异常处理部分然后执行如下代码块:

BEGIN   plch_proc (0);   plch_proc (-1);EXCEPTION   WHEN OTHERS   THEN      DBMS_OUTPUT.put_line ('All handled');END;/


            随后我应该在屏幕上看到如下输出:

            Bad division
            All handled

(A)EXCEPTION   WHEN 'ORA-01476'   THEN      DBMS_OUTPUT.put_line ('Bad division');(B)EXCEPTION   WHEN ZERO_DIVIDE   THEN      DBMS_OUTPUT.put_line ('Bad division');(C)EXCEPTION   WHEN OTHERS   THEN      IF SQLCODE = -01476      THEN         DBMS_OUTPUT.put_line ('Bad division');      ELSE         RAISE;      END IF;(D)EXCEPTION   WHEN OTHERS   THEN      IF SQLCODE = 1476      THEN         DBMS_OUTPUT.put_line ('Bad division');      END IF;(E)EXCEPTION   WHEN OTHERS   THEN      IF SQLCODE = -1476      THEN         DBMS_OUTPUT.put_line ('Bad division');      END IF;


       答案

                   选择:BC

           A: 语法错误,WHEN后面必须跟着已定义好的异常,可以是系统定义或自定义


           B: ZERO_DIVIDE是系统定义异常


           C: 通过WHEN OTHERS捕获了所有异常并对其中一种错误代码进行处理,其他的继续抛出,所以上层还能捕获到其他异常


 

           D: 错误代码写得不对
              SQLCODE一般返回负数,处理这几种情况:
              ① 没有异常(返回0)
              ② 用户自定义异常而且没有用EXCEPTION_INIT和一个错误代码关联
                 此时返回1用户自定义异常而且没有用EXCEPTION_INIT和一个错误代码关联(此时返回1)
              ③ NO_DATA_FOUND(SQLCODE返回100)


           E: 和C的区别是没有用RAISE继续抛出,所以上层无法捕获