异常处理
编辑教程异常处理
异常是在程序执行期间出现的问题。 当异常发生时,程序的正常流程中断,程序应用程序异常终止,这是不推荐的,因此这些异常将被处理。
异常提供了一种将控制从程序的一个部分转移到另一个部分的方法。
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()方法用于获取异常的描述。 |
异常的属性
这里是异常的五个属性和方法:
属性 | 说明 |
---|---|
Textid | 用于定义异常的不同文本,并且也影响方法get_text的结果。 |
Previous | 此属性可以存储原始异常,允许您构建异常链。 |
get_text | 这将根据异常的系统语言将文本表示作为字符串返回。 |
get_longtext | 这会将异常的文本表示的长变体作为字符串返回。 |
get_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
Mos固件,小电视必刷固件
ES6 教程
Vue.js 教程
JSON 教程
jQuery 教程
HTML 教程
HTML 5 教程
CSS 教程
CSS3 教程
JavaScript 教程
DHTML 教程
JSON在线格式化工具
JS在线运行
JSON解析格式化
jsfiddle中国国内版本
JS代码在线运行
PHP代码在线运行
Java代码在线运行
C语言代码在线运行
C++代码在线运行
Python代码在线运行
Go语言代码在线运行
C#代码在线运行
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。
大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
选择支付方式:
立即支付
¥
9.99
无法付款,请点击这里
金额: 0 元
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟