Exception是指ABAP程序在正常执行过程中不能够正常执行下去的情况。BASIS RELEASE 610之后,exception是在exception class的基础之上实现的。CLASS based exception既可以通过abap语句触发也可以由runtime system触发。可以自己定义exception class,不过系统已经自带了一系列的exception class。一个exception由一个exception object来代表,即一个exception class的实例,exception object的属性描述了exception的具体情况。Class-based exception可以应用于ABAP程序的所有processing blocks。Class-based Exception发生时,当前运行的程序被中断,系统试图找到合适的handler,如果找不到就会发生runtime error。
所有的exception class都继承于下面三个类:CX_NO_CHECK,CX_DYNAMIC_CHECK和CX_STATIC_CHECK,这些类继承于CX_ROOT。所有的exception class都有前缀CX_。Exception class一般都是global的,不过也可以定义local的exception class。CX_ROOT有两个预定义的方法,GET_SOURCE_POSITION用来返回程序名,include程序名,发生exception的源代码所在的行数。GET_TEXT用来返回exception文本。所有的exception class都继承了CX_ROOT的KERNEL_ERRID属性,用来返回由runtime触发的exception名称。
Processing blocks without local data areas:event blocks,dialog modules。
继承于cx_static_check的exception要么被handle要么通过RAISING来pass along。这种情形是通过系统的语法检查来保证的。自定义的exception只能是这个类的子类。继承与cx_dynamic_check的子类同cx_static_check的情形一样,只不过其没有被语法检查保护,如果这种exception发生时既没有被保护也没有被pass along那么就会产生一个runtime error。大部分预定义的系统exception前缀名是cx_sy…都继承于cx_dynamic_check。继承与cx_no_check的exception不能被raising但是可以被handle,如果没有被handle他就会自动向上pass along至到最顶端,如果还没有被caught那么他就会抛出runtime error。这种情况也不能被语法检查检测到。一些预定义的exception继承于这个类。