zoukankan      html  css  js  c++  java
  • 【Oracle】异常信息的加工处理

    引言

        很多时候,我们调用oracle存储过程都会发生各种各样的异常信息,例如ORA-12899值过大,ORA-01400不能插入空值等.虽然说这类异常是前端没控制到位的缘故,但是现实很难100%完全控制住,所以一旦发生了这类异常,并返回的前端显示时就会造成很差的用户体验了.或许,我们可以将这类异常加工一下,包装得好看些,让用户看得懂发生了什么事情,能够自行处理.下面是我的一点尝试.

        我们通常会在oracle存储过程的异常处理得到异常信息,如:

    Exception
        When Others Then
         rollback;
         dbms_output.put_line(sqlerrm);
         Raise_Application_Error(-20000,sqlerrm); 

         然而,我们将会得到下面的异常信息,如

    ORA-12899: 列 "NIS"."T_CZL_ACCOUNT"."VC_ACCOUNT" 的值太大 (实际值: 35, 最大值: 20)

         虽然说我们99%的程序员都看得懂这个是什么意思,但是也有99%的用户看不出个所以然.我们的目标是意外发生了,用户依然看得懂.接下来,我需要创建一个函数,专门处理这类的异常,返回大部分用户看得懂的信息.函数代码如下:

    create or replace function f_czl_geterror(message in varchar2)
    return varchar2 is
       Result varchar2(1000);
      
       num1 number:=0;
       num2 number:=0;
       num3 number:=0;
       num4 number:=0;
       num5 number:=0;
       num6 number:=0;
       num7 number:=0;
       num8 number:=0;
       num9 number:=0;
       num10 number:=0;
       str1 varchar2(1000);             
       str2 varchar2(1000);  
       str3 varchar2(1000);
       str4 varchar2(1000);
       str5 varchar2(1000);                                
       str6 varchar2(1000);             
       str7 varchar2(1000);  
       str8 varchar2(1000);
       str9 varchar2(1000);
       str10 varchar2(1000);
    begin
       
        if instr(message, 'ORA-12899')>0 then
         num1:=instr(message,'ORA-12899'); --得到 ORA-12899的所在位置
         str1:=substr(message,num1);    --得到ORA-12899后面的所有字符 
         num2:=instr(str1,'"',1,3);    --得到ORA-12899后面第三个"的位置
         num3:=instr(str1,'"',1,4);    --得到ORA-12899后面第四个"的位置
         str2:=substr(str1,num2+1,num3-num2-1);  --得到表名
         num4:=instr(str1,'"',1,5);    --得到ORA-12899后面第五个"的位置
         num5:=instr(str1,'"',1,6);    --得到ORA-12899后面第六个"的位置
         str3:=substr(str1,num4+1,num5-num4-1);  --得到字段名
         
         num6:=instr(str1,':',1,2);    --得到ORA-12899后面第二个:的位置
         num7:=instr(str1,',',1,1);    --得到ORA-12899后面第1个,的位置
         str5:=substr(str1,num6+1,num7-num6-1);  --得到输入的长度
         
         num8:=instr(str1,':',1,3);    --得到ORA-12899后面第二个:的位置
         num9:=instr(str1,')',1,1);    --得到ORA-12899后面第1个,的位置
         str6:=substr(str1,num8+1,num9-num8-1);  --得到最大的长度
           
         --得到对应的字段注释
         select t.comments into str4 from SYS.USER_COL_COMMENTS t where t.column_name=str3 and t.table_name=str2;
         
         Result:=str4||'长度超出限制,最大字符数为'||str6||',您输入的字符数为'||str5||'.';
        elsif  instr(message, 'ORA-01400')>0  then
           
         num1:=instr(message,'ORA-01400'); --得到 ORA-01400的所在位置
         str1:=substr(message,num1);    --得到ORA-01400后面的所有字符 
         num2:=instr(str1,'"',1,3);    --得到ORA-01400后面第三个"的位置
         num3:=instr(str1,'"',1,4);    --得到ORA-01400后面第四个"的位置
         str2:=substr(str1,num2+1,num3-num2-1);  --得到表名
         num4:=instr(str1,'"',1,5);    --得到ORA-01400后面第五个"的位置
         num5:=instr(str1,'"',1,6);    --得到ORA-01400后面第六个"的位置
         str3:=substr(str1,num4+1,num5-num4-1);  --得到字段名
         
          --得到对应的字段注释
         select t.comments into str4 from SYS.USER_COL_COMMENTS t where t.column_name=str3 and t.table_name=str2;
         
          Result:=str4||'不能为空,请输入内容.';
       elsif  instr(message, 'ORA-01438')>0  then
           
      
          Result:=str4||'数字长度超出限制,请检查!';
        else
          
            Result:=message;
        end if;
        
          return(Result);
    end f_czl_geterror;

        然后我们在存储过程的异常处理中用上这个函数,如:

    Exception
        When Others Then
         rollback;
         dbms_output.put_line(f_czl_geterror(sqlerrm));
         Raise_Application_Error(-20000,f_czl_geterror(sqlerrm));   

        再测试看看,我们得到了:

    账号长度超出限制,最大字符数为 20,您输入的字符数为 35.

        起码有的用户看得懂了是吧,咱们的目标算是达成了.

    小结

      上文介绍了如何将oracle的系统异常信息转换成用户看得懂的信息.其实这只是一种补救的措施罢了,某种程度上是'欺骗'了用户,程序是正常运行的,但是不能否认的是我们的程序依然不完善.但是,有的补救好过没有是吧.最后,如果您有更好的建议,请不吝指教.

  • 相关阅读:
    Laravel + Vue 之 OPTIONS 请求的处理
    Vue2.0 keep-alive 组件的最佳实践
    Vue.js 登录注册实现
    数仓项目04:环境搭建(MysqlHA+Hive)
    CentOS7_JDK安装和环境变量配置
    改环境变量改出问题了,vi,ls这些命令都不能用了,怎么办
    CentOS7配置网络
    curl命令下载jdk
    CentOS7设置IP地址
    ODPS
  • 原文地址:https://www.cnblogs.com/caizl/p/4379959.html
Copyright © 2011-2022 走看看