首页 > 其他分享 >异常处理

异常处理

时间:2023-07-13 10:24:50浏览次数:21  
标签:exception 错误 处理 when output 异常 ORA

异常处理

希望程序继续执行

错误处理

错误处理部分位于异常的可执行部分之后,是由when语句引导多个分支构成语法如下

exception
  when 错误1 [or 错误2] then
  语句序列1;
  when 错误3[or 错误4] then
  语句序列2;
  when others then
  语句序列n;

错误是在标准包中由系统预定义的标准错误,或是由用户在程序说明部分自定义的错误。

凡是出现在when后面的错误都说可以捕捉的错误,其他未被捕捉的错误,将在when others部分进行统一处理,others必须是exception部分最后一个错误处理分支。如果要在该分支进一步进行判断错误种类,可以通过使用预定义函数sqlcode()和sqlerrm()来活动系统错误号和错误信息。

如果在程序子块中发生错误,但是子块没有错误处理部分,则错误将会传递到主程序中。

预定义错误

oracle系统错误很多,只有一部分常见错误在标准包中予以定义。定义错误在exception部分通过标准错误名来进行判定,并进行异常处理。常见预定义异常如下。

错误名称错误代码错误
CURSOR_ALREADY_OPEN ORA_06511 试图打开已经打开的游标
INVALID_CLUSOR ORA_01001 视图使用没有打开的游标
DUP_VAL_ON_INDEX ORA_00001 保存重复值到唯一索引约束的列中
ZERO_DIVIDE ORA_01476 发生除数为0的除法错误。
INVALID_NUMBER ORA_01722 视图对无效字符进数值转换
ROWTYPE_MISMATCH 0RA-06504 主变量和游标的类型不兼容
VALUE_ERROR ORA_06502 转换,截断或算术运算错误。
too_many_rows ORA_01422 SELECT ..INTO 语句返回多余一行的数据
no_data_found ORA_01403 SELECT ..INTO 语句没有数据返回
timeout_on_resource ora_00051 等待资源时发生超时错误。
transaction_backed_out ora_00060 由于死锁提交失败
storage_error ora_06500 发生内存错误
program_error ora_06501 发生pl/sql内部错误
not_logged_on ora_01012 视图操作未连接的数据库
login_dented ora_01017 在连接时提供了无效用户名或口令
定义错误

如果一个系统错误没有在标准包中定义,则需要在说明部分定义,定义后使用pragma exception_init来将一个定义错误同一个特别的oracle错误代码相关联,就i可以同系统预定义的错误一样,使用

语法如下

    错误名 EXCEPTION ;
PRAGMA EXCEPTION_INIT(错误名,错误代码);
--注意(9i中)PRAGMAEXCEPTION_INIT(错误名,错误代码);
--eg1
declare
  str varchar2(2000);
  to_manyvaluesss exception;
  pragma exception_init(to_manyvaluesss,-00913);
begin
  str:='insert into xujb_temp4 values(''23331'',''hj'')';
  execute immediate str;
  excepiton
      when to_manyvaluesss then
      dbms_output.putline('数据值过多'||sqlcode||','||sqlerrm);
      when others then
      dbms_output.putline('其他未知错误'||sqlcode||','||sqlerrm);
end;

 

自定义异常

程序设计者可以利用引发异常的机制来进行程序设计,自己定义异常类型,可以在声明部分定义新的异常类型,用户定义的错误不能由系统来触发,必须由程序员显示的触发

错误名  EXCEPTION;  -----定义异常

RAISE 错误名;       ------抛出异常,手动触发

RAISE 也可以用来引发模拟系统错误,比如,RAISE ZERO_DIVIDE将引发模拟除零错误。

使用RAISE_APPLICATION_ERROR函数也可以引发异常。该函数要传递两个参数,第一个是用户自定义错误编号,的哥是参数用户自定义的错误信息。使用该函数引发的异常的编号应该在20 000和20 999之间选择

自定义异常的处理方式同前

---eg1:

declare
  my_exception1 exception;
  my_exception2 exception;
  sale1 number default 8000;
  str varchar2(2000);
begin
   insert into xujb_temp1 values('7','王小儿',sale1);
  if sale1>6000 then
  rasie my_exception1;
  elsif sale1<1000 then
  raise my_exception2;
  end if;
  commit;
  dbms_output.put('数据录入成功');
  exception
      when my_exception1 then
      dbms_output.put('金额超限6000录入失败');
      rollback;
      when my_exception2 then
      dbms_output.put('金额低于下限1000录入失败');
      rollback;
      when others then
      dbms_output.put('其他异常'||sqlcode||','||sqlerrm);

end;

--eg2使用RAISE_APPLICATION_ERROR函数抛出异常并终止程序,类似系统报错

declare
v_sale number default 10000;
begin
   insert into xujb_temp1 values('7','卢路',v_sale);
  if
  v_sale>5000 then
  raise_application_error(-20001,'超过上限金额无法录入');
  elsif v_sale<1000 then
  raise_application_error(-20002,'低于金额下限无法录入');
  end if;
  commit;
  exception
      when others then
      dbms_output.put_line('其他异常'||sqlcode||','||sqlerrm);
end;


 

标签:exception,错误,处理,when,output,异常,ORA
From: https://www.cnblogs.com/xjianbing/p/17549677.html

相关文章

  • windows环境下批处理文件方案
    1:window机器上创建一个.bat结尾的批处理文件@echooffecho袁大总统接口自动化运行准备开始......@echoondel/f/s/qG:\SongQin\Python\Demo\teach_sq\report\tmp\*.jsondel/f/s/qG:\SongQin\Python\Demo\teach_sq\report\tmp\*.jpgdel/f/s/qG:\SongQin\Pyt......
  • 欧姆龙CJ系列PLC以太网通讯处理器欧姆龙cp2e以太网通讯
    捷米特JM-ETH-CJ转以太网模块是一款经济型的以太网通讯处理器,是为满足日益增多的工厂设备信息化需求(设备网络监控和生产管理)而设计,用于欧姆龙CJ1/CJ2/CS1系列PLC的以太网数据采集,非常方便构建生产管理系统。 捷米特JM-ETH-CJ转以太网模块采用即插即用设计,不占用PLC通讯口,即编......
  • 同时处理列表分页加载功能和Reload功能经验
    功能背景:1. 首先我们这个列表它带有搜索功能2.左边是列表,右边为详情。3.页面上方有添加新项功能,会放到第一个。4.这是一个零件列表,同一个页面可以有无数个这种零件列表  第一,列表带有搜索功能,当搜索的发生改变时要将请求页数重置为1。这里我们应该如何做呢?当请......
  • 若要通过批处理启用桌面上的计算机、回收站、用户文件夹、控制面板和网络图标,你可以使
    Windows11桌面图标设置启用计算机回收站用户的文件控制面板网络图标批处理若要通过批处理启用桌面上的计算机、回收站、用户文件夹、控制面板和网络图标,你可以使用下面的批处理脚本:@echooffREM启用计算机图标regadd"HKCU\Software\Microsoft\Windows\CurrentVers......
  • com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not al
    在做学成在线项目时,启动项目报错:com.mysql.cj.exceptions.UnableToConnectException:PublicKeyRetrievalisnotallowedatsun.reflect.NativeConstructorAccessorImpl.newInstance0(NativeMethod)atsun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstr......
  • Java 基础 - 异常随笔
     异常基础总结try、catch和finally都不能单独使用,只能是try-catch、try-finally或者try-catch-finally。try语句块监控代码,出现异常就停止执行下面的代码,然后将异常移交给catch语句块来处理。catch–用于捕获异常。catch用来捕获try语句块中发生的异常。finally语句块中的......
  • k8s集群node NotReady处理流程-->kubelet状态error,并伴有报错:kubelet.service has mor
    k8s集群nodeNotReady处理流程-->kubelet状态error//20230712集群有节点NotReadykubelet状态error,并伴有报错:kubelet.servicehasmorethanoneExecStart=setting,whichisonlyallowedforType=oneshotservices.Refusing在此记录一下解决流程解决流程问题定位:使......
  • os: pv 命令 - 显示数据处理的进度条
    os:pv命令 - 显示数据处理的进度条    一、pv 命令 1、pv 命令功能:显示数据处理的进度条 2、pv 命令安装:sudo apt install -y  pvdnf install -y   pv 3、pv 命令说明:[wit@ontmp]$pv--hel......
  • 计算机操作系统-2-处理器管理
    Lecture2-处理器管理处理器管理是操作系统的重要组成部分处理器负责管理、调度和分配计算机系统的重要资源,并控制程序执行处理器管理中最重要的是处理器调度,即进程调度,也就是控制、协调进程对处理器的竞争。进程与线程进程是资源分配和管理的单位线程是处理器调度的基本单......
  • 【面试必背知识】Java 中常见的异常有哪些?
    ......