SAP ABAP 异常处理

异常是在程序执行期间出现的问题。 当异常发生时,程序的正常流程中断,程序应用程序异常终止,这是不推荐的,因此这些异常将被处理。

SAP ABAP 异常处理 图1
赛锐信息,SAP ERP定制,ERP定制

异常提供了一种将控制从程序的一个部分转移到另一个部分的方法。 ABAP异常处理建立在三个关键字 – RAISE,TRY,CATCH和CLEANUP。 假设块将引发异常,则方法使用TRY和CATCH关键字的组合捕获异常。 TRY – CATCH块放置在可能生成异常的代码周围。 以下是使用TRY – CATCH的语法:

TRY.      
Try Block <Code that raises an exception> 
  
CATCH  
Catch Block <exception handler M>  
. . . 
. . . 
. . . 
CATCH  
Catch Block <exception handler R>
   
CLEANUP. 
   Cleanup block <to restore consistent state>
 
ENDTRY.

RAISE – 提出异常,表示发生了一些异常情况。 通常,异常处理程序会尝试修复错误或找到替代解决方案。

TRY – TRY块包含要处理其异常的应用程序编码。 此语句块按顺序处理。 它可以包含进一步的控制结构和程序调用或其他ABAP程序。 它后面是一个或多个catch块。

CATCH – 程序在要处理问题的程序中的地方使用异常处理程序捕获异常。 CATCH关键字表示捕获异常。

CLEANUP – 每当在TRY块中发生异常,而TRY块未被同一TRY – ENDTRY结构的处理程序捕获时,将执行CLEANUP块的语句。 在CLEANUP子句中,系统可以将对象恢复到一致状态或释放外部资源。 也就是说,可以对TRY块的上下文执行清除工作。

提出异常

可以在方法中的任何点,函数模块,子例程等提出异常。 有两种方式可以引发异常:

  • ABAP运行时系统引发的异常。例如,Y = 1 / 0.这将导致类型CX_SY_ZERODIVIDE的运行时错误。
  • 程序员提出的异常。同时提升和创建异常对象。 使用第一个方案中已存在的异常对象来引发异常。 语法是:RAISE EXCEPTION exep。

捕捉异常

处理程序用于捕获异常。

让我们来看看一段代码片段:

DATA: result TYPE P LENGTH 8 DECIMALS 2, 
exref TYPE REF TO CX_ROOT, 
msgtxt TYPE STRING. 
PARAMETERS: Num1 TYPE I, Num2 TYPE I. 
TRY. 
result = Num1 / Num2. 
CATCH CX_SY_ZERODIVIDE INTO exref. 
msgtxt = exref→GET_TEXT( ). 

CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref. 
msgtxt = exref→GET_TEXT( ).

在上面的代码片段中,我们试图将Num1除以Num2,得到一个float类型变量的结果。

可以生成两种类型的异常。

  • 数字转换错误。
  • 除以零异常。 处理程序捕获CX_SY_CONVERSION_NO_NUMBER异常以及CX_SY_ZERODIVIDE异常。 这里异常类的GET_TEXT()方法用于获取异常的描述。

异常的属性

这里是异常的五个属性和方法:

编号属性和说明
1Textid用于定义异常的不同文本,并且也影响方法get_text的结果。
2Previous
此属性可以存储原始异常,允许您构建异常链。
3get_text这将根据异常的系统语言将文本表示作为字符串返回。
4get_longtext这会将异常的文本表示的长变体作为字符串返回。
5get_source_position给出引发异常的程序名和行号。

例子

REPORT ZExceptionsDemo. 
PARAMETERS Num_1 TYPE I. 

DATA res_1 TYPE P DECIMALS 2. 
DATA orf_1 TYPE REF TO CX_ROOT. 
DATA txt_1 TYPE STRING. 

start-of-selection. 
Write: / 'Square Root and Division with:', Num_1. 
write: /. 

TRY. 
IF ABS( Num_1 ) > 150. 
RAISE EXCEPTION TYPE CX_DEMO_ABS_TOO_LARGE. 
ENDIF.
  
TRY. 
res_1 = SQRT( Num_1 ). 
Write: / 'Result of square root:', res_1. 
res_1 = 1 / Num_1. 

Write: / 'Result of division:', res_1. 
CATCH CX_SY_ZERODIVIDE INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ). 
CLEANUP. 
CLEAR res_1. 
ENDTRY. 

CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ).

CATCH CX_ROOT INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ). 
ENDTRY. 
IF NOT txt_1 IS INITIAL. 
Write / txt_1. 
ENDIF. 
Write: / 'Final Result is:', res_1.

在此示例中,如果数字大于150,则引发异常CX_DEMO_ABS_TOO_LARGE。 上面的代码为数字160生成以下输出。

Square Root and Division with: 160 
The absolute value of number is too high 
Final Result is:  0.00

关于赛锐信息

作为SAP的资深合作伙伴,赛锐信息是一家专业提供SAP行业化管理软件解决方案的顾问公司,致力于为企业提供SAP ERP系统咨询服务、IT规划、业务流程优化、信息系统实施、行业信息系统方案开发,运营外包及售后维护等全面的服务方案。已服务1000+家不同行业、规模的大中小型企业客户。在电子高科技、汽车零部件、印刷包装、医疗器械、快消品、专业服务等行业信息化管理领域具有领导性地位。

相关文章

联系我们

联系我们

130-0752-1773

在线咨询:点击这里给我发消息

邮件:info@sapzx.com

工作时间:周一至周五9:00-18:00,节假日正常休息

关注微信
关注微信
分享本页
返回顶部