OraclePLSQLException异常分类、异常抛出、异常处理、异
常传播
⼀、摘要
在PLSQL程序开发过程中,很重要的部分就是对程序异常的监控和处理,包括如何触发异常,何时进⾏处理,如何进⾏处理,是否将程式中的所有异常集中在⼀起,通过公共异常处理的procedure或function,如果没有完善的程式处理机制,很难说该程式是⼀只健壮的程式,当程式遇到很多类型或者量很多资料时,系统若没有异常处理必然会导致程式的出错
当预判到了某些异常,需要对预判到的异常进⾏合适相应的处理,是否抛出异常还是忽略还是其他
当然程式没有预判到或者是⼀些未知的异常遇到,所以异常处理模块也要考虑这些未预见到的程式
PLSQL异常的资料⽹络流传很多,都有些类似,归纳的很详细了,资料被转来转去,也不太清楚原⽂的出处,向未知的⼤神致敬
plsql12配置数据库连接本⽂整理下⽹络上的资料,并重新排版了下
⼆、概述
1. 异常的分类
1.1 系统⾃带异常
1.1.1 概念:执⾏期间返回到PL/SQL块的ORACLE错误或由PL/SQL代码的某操作引起的错误,如除数为零或内存溢出的情况
每当PL/SQL违背了ORACLE原则或超越了系统依赖的原则就会隐式的产⽣内部异常。
因为每个ORACLE错误都有⼀个号码并且在PL/SQL中异常通过名字处理,ORACLE提供了预定义的内部异常
1.1.2 例⼦:未定义异常,系统遇到预定义异常时,⾃动抛出,如no_data_found
1.2 ⽤户定义异常
1.2.1 概念:由开发者显⽰定义,在PL/SQL块中传递信息以控制对于应⽤的错误处理
如果要处理未命名的内部异常,必须使⽤OTHERS异常处理器或PRAGMA EXCEPTION_INIT 。
PRAGMA由编译器控制,或者是对于编译器的注释。PRAGMA在编译时处理,⽽不是在运⾏时处理。
EXCEPTION_INIT告诉编译器将异常名与ORACLE错误码结合起来,这样可以通过名字引⽤任意的内部异常,并且可以通过名字为异常编写⼀适当的异常处理器。
1.1.2 例⼦:⾃定义⼀个异常bxj_exception,并抛出
2. 异常的抛出
2.1 通过PLSQL引擎⾃动处理
2.1.1 概念:当数据库或PL/SQL在运⾏时发⽣错误时,⼀个异常被PL/SQL运⾏时引擎⾃动抛出
2.1.2 例⼦:系统⾃导抛出异常,并处理
2.2 通过Raise
2.2.1 概念:异常也可以通过RAISE语句抛出RAISE exception_name;
显式抛出异常是程序员处理声明的异常的习惯⽤法,但RAISE不限于声明了的异常,它可以抛出任何任
何异常。例如,你希望⽤TIMEOUT_ON_RESOURCE错误检测新的运⾏时异常处理器
2.2.2 例⼦:通过raise语句将异常抛出
2.3 通过Raise_Application_Error
2.3.1 概念: RAISE_APPLICATION_ERROR 内建函数⽤于抛出⼀个异常并给异常赋予⼀个错误号以及错误信息。
⾃定义异常的缺省错误号是+1,缺省信息是 User_Defined_Exception。
RAISE_APPLICATION_ERROR函数能够在pl/sql程序块的执⾏部分和异常部分调⽤,显式抛出带特殊错误号的命名异常。
Raise_application_error(error_number,message[,true,false])
错误号的范围是-20,000到-20,999。错误信息是⽂本字符串,最多为2048字节。TRUE和FALSE表⽰是添加(TRUE)进错误堆(ERROR STACK)还是覆盖(overwrite)错误堆(FALSE)
2.3.2 例⼦:通过raise_application_error语句将异常抛出
3. 异常的处理
3.1 ⽤户⾃定异常处理、系统⾃带异常处理、未知异常处理
以下⼀个简单的例⼦说明了程式三种异常的捕捉和处理
3.2 在声明阶段中异常
以下⼀个简单的例⼦说明了在声明阶段的异常,⼀般来说package执⾏过程中很少遇到这种错误,因为在编译过程中就会审计除⾮所引⽤的table的结构发⽣变化,导致引⽤失败
4. 异常的传播
4.1 如果异常发⽣在执⾏块
当⼀个异常错误在执⾏部分引发时,有下列情况:
如果当前块对该异常错误设置了处理,则执⾏它并成功完成该块的执⾏,然后控制转给包含块。
如果没有对当前块异常错误设置定义处理器,则通过在包含块中引发它来传播异常错误。然后对该包含块执⾏步骤
4.2 如果异常发⽣在声明块
如果在声明部分引起异常情况,即在声明部分出现错误,那么该错误就能影响到其它的块
5. 异常的SQLCode 和 SQL Errm
5.1 概念
由于ORACLE 的错信息最⼤长度是512字节,为了得到完整的错误提⽰信息,我们可⽤ SQLERRM和 SUBSTR 函数⼀起得到错误提⽰信息,⽅便进⾏错误,特别是如果WHEN OTHERS异常处理器时更为⽅便。
5.2 例⼦
产⽣SQLCode和SQLErrm
6. Oracle fnd_file.output 和 fnd_file.log
6.1 fnd_file.output
⽤于Request输出报表产⽣layout,⼀般不能在这⾥写log语句
6.2 fnd_file.log
⽤于存放程式log记录,⽤于写log,程式异常处理记录都可以通过这个api进⾏记录
7. 附件
7.1 附件 - Oracle⾃带异常列表

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。