- SAP ABAP 教程
- SAP ABAP - 首页
- SAP ABAP - 概述
- SAP ABAP - 环境
- SAP ABAP - 屏幕导航
- SAP ABAP - 基本语法
- SAP ABAP - 数据类型
- SAP ABAP - 变量
- SAP ABAP - 常量 & 字面量
- SAP ABAP - 运算符
- SAP ABAP - 循环控制
- SAP ABAP - 决策
- SAP ABAP - 字符串
- SAP ABAP - 日期 & 时间
- SAP ABAP - 数据格式化
- SAP ABAP - 异常处理
- SAP ABAP - 字典
- SAP ABAP - 域
- SAP ABAP - 数据元素
- SAP ABAP - 表格
- SAP ABAP - 结构
- SAP ABAP - 视图
- SAP ABAP - 搜索帮助
- SAP ABAP - 锁对象
- SAP ABAP - 模块化
- SAP ABAP - 子程序
- SAP ABAP - 宏
- SAP ABAP - 函数模块
- SAP ABAP - 包含程序
- SAP ABAP - Open SQL 概述
- SAP ABAP - Native SQL 概述
- SAP ABAP - 内部表
- SAP ABAP - 创建内部表
- ABAP - 填充内部表
- SAP ABAP - 复制内部表
- SAP ABAP - 读取内部表
- SAP ABAP - 删除内部表
- SAP ABAP - 面向对象
- SAP ABAP - 对象
- SAP ABAP - 类
- SAP ABAP - 继承
- SAP ABAP - 多态
- SAP ABAP - 封装
- SAP ABAP - 接口
- SAP ABAP - 对象事件
- SAP ABAP - 报表编程
- SAP ABAP - 对话编程
- SAP ABAP - 智能表单
- SAP ABAP - SAPscripts
- SAP ABAP - 客户出口
- SAP ABAP - 用户出口
- SAP ABAP - 业务增强
- SAP ABAP - Web Dynpro
- SAP ABAP 有用资源
- SAP ABAP - 问答
- SAP ABAP - 快速指南
- SAP ABAP - 有用资源
- SAP ABAP - 讨论
SAP ABAP - 异常处理
异常是在程序执行过程中出现的错误。当发生异常时,程序的正常流程会被中断,程序应用会异常终止,这是不推荐的,因此这些异常需要被处理。
异常提供了一种将控制权从程序的一个部分转移到另一个部分的方法。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 - 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 以在浮点型变量中获得结果。
可能会生成两种类型的异常。
数字转换错误。
除以零异常。处理程序捕获 CX_SY_CONVERSION_NO_NUMBER 异常以及 CX_SY_ZERODIVIDE 异常。这里使用异常类的 GET_TEXT( ) 方法来获取异常的描述。
异常的属性
以下是异常的五个属性和方法:
| 序号 | 属性 & 描述 |
|---|---|
| 1 | Textid 用于为异常定义不同的文本,也影响 get_text 方法的结果。 |
| 2 | 上一页 此属性可以存储原始异常,允许您构建异常链。 |
| 3 | get_text 根据系统的语言返回异常的文本表示形式(字符串)。 |
| 4 | get_longtext 返回异常的文本表示形式的长版本(字符串)。 |
| 5 | 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