前言

在类方法中处理业务逻辑时,对于异常情况需要中断类定义或者类方法的执行.同时这些异常情况还需要被调用点捕获,以便报错或者进入例外处理逻辑.

如果没有捕获这些错误,则会产生SHORT DUMP.

本文主要讲解类中触发异常的方式及调用类捕获异常的方式

异常处理方式

在ABAP类中异常处理有两种方式

  • 传统方式

  • 异常类方式

这两种方式不能混用. 一个特定的类方法中只能使用一种方式.但是同一个类中的不同的方法可以各自使用一种方式

传统方式

传统方式与函数的异常处理类似.

01

触发异常

在类方法中添加异常, 通过RAISE 语句或者 MESSAGE   RAISING  触发异常.

02

捕获异常

传统异常的捕获只能通过 调用方法时,传递EXCEPTION 参数. 特定异常返回一个值到 SY-SUBRC 中. 在调用点对 SY-SUBRC 内容进行判断,执行后续逻辑.

异常类方式

使用一个特殊的类-异常类来集中管理异常

01

创建异常类

创建一个异常类ZCX_TEST_EXCEPTION,创建的时候,系统识别ZCX_前缀, 会自动填充超类 CX_STATIC_CHECK ,且类型设置为异常类.异常类会自动生成类的构造方法代码且不可修改.

02

可能犯的错误

如果异常类的实例生成没有设置为2. 使用时会报下图的错误, 设置成公用后, 就不会报错了.

如果在类方法的异常中没有引入异常类, 语法检查报警告,捕获错误没有明确的信息

测试调用对象,捕获如下错误

03

引入异常类

需要在例外中引用该异常类

04

触发异常类

触发异常时可以传递参数, 也可以不传递参数,使用异常类中默认的消息

05

异常类的捕获

06

触发异常类传递的参数

MSGID  MSGNO 用于识别一条消息. ATTR1-ATTR4 传递的并不是消息的变量内容. 而是类的属性 . 比如 IF_T100_DYN_MSG~MSGV1 或者自定义的属性

如果在ATTR1-ATTR4中传递一个字符串. 最终捕获的错误文本中 将出现 &字符串&

异常类中需要定义属性默认值. 这样才能通过参数传递所需的属性的名称. 最终使用消息+属性内容形成消息内容

通用异常类

如果希望系统生成的异常类传递错误消息内容不带&符号.可以通过添加异常类属性和改写 IF_MESSAGE~GET_TEXT 方法. 在RAISE EXCEPTION时传递一个消息描述

01

创建异常类

创建一个通用异常类 ZCX_BC_COMM

02

添加属性

添加属性 ERROR_TEXT

添加的属性会自动出现在构造方法中的参数中,并且会自动添加赋值到属性的语句

03

重定义方法

重定义方法 IF_MESSAGE~GET_TEXT

重定义方法的代码内容 优先获取 me->error_text 属性中的内容返回

04

触发通用异常类

触发异常类时,传递自定义的属性生成的参数

05

捕获的消息

总结

类异常的触发及捕获建议使用异常类的方式. 这样可以更加灵活的处理类异常情况.

捕获异常时,可以使用特定的异常类捕获. 也可以使用根类 CX_ROOT捕获(在不知道特定的异常类的情况下)

本文涉及到的代码

  • 测试程序        ZTS_CLASS_EXCEPTION

  • 对应的测试类 ZCL_TEST_EXCEPTION

  • 对应的异常类 ZCX_TEST_EXCEPTION

  • 通用异常类     ZCX_BC_COMM

详细代码详见文末(异常类系统不支持源码显示模式,无法复制源代码)

约定

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.

(如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)

公众号 : syjf1976_abap

          ABAP开发技巧

微信号 : 392077

请微信联系管理员:

syjf1976

sharry_xlp

Yannick_Duan

申请进入公众号讨论群提问或者参与话题讨论

源代码部分

ZTS_CLASS_EXCEPTION

*&---------------------------------------------------------------------*
*& Report ZTS_CLASS_EXCEPTION
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zts_class_exception.DATA: gc_test TYPE REF TO zcl_test_exception.START-OF-SELECTION.
*创建对象CREATE OBJECT gc_test.cl_demo_output=>next_section( title = '返回例外:' ).
*使用旧的例外方式: 单行代码CALL METHOD gc_test->test_old( EXPORTING iv_error = '1' EXCEPTIONS error_1 = 1 error_2 = 2 ).IF sy-subrc <> 0.cl_demo_output=>write( '类方法返回例外:' && sy-subrc && '无消息' ).ENDIF.
*使用旧的例外方式:多行代码CALL METHOD gc_test->test_oldEXPORTINGiv_error = '2'EXCEPTIONSerror_1  = 1error_2  = 2OTHERS   = 3.IF sy-subrc <> 0.cl_demo_output=>write( '类方法返回例外:' && sy-subrc && '成功消息:' && sy-msgno && sy-msgty && sy-msgid && sy-msgv1 ).ENDIF.*使用旧的例外方式:新语法创建对象并调用方法.NEW zcl_test_exception( )->test_old( EXPORTING iv_error = '3' EXCEPTIONS error_1 = 1 error_2 = 2 error_3 = 3 ) .IF sy-subrc <> 0.cl_demo_output=>write( '类方法返回例外:' && sy-subrc && '错误消息:'  && sy-msgno && sy-msgty && sy-msgid && sy-msgv1 ).ENDIF.*使用新的例外方法cl_demo_output=>next_section( title = '捕获例外,错误方式:' ).TRY.CALL METHOD gc_test->test_new( EXPORTING iv_error = '1' ).CATCH cx_root INTO DATA(lo_ref).    "也可以捕获这个所有错误类的根类DATA(lv_msg) = lo_ref->get_text( ).cl_demo_output=>write( '捕获类中的例外:' && lv_msg ).ENDTRY.
*带有消息的例外.TRY.CALL METHOD gc_test->test_new( EXPORTING iv_error = '2' ).CATCH cx_root INTO lo_ref.    "也可以捕获这个所有错误类的根类lv_msg = lo_ref->get_text( ).cl_demo_output=>write( '捕获类中的例外:' && lv_msg ).ENDTRY.*使用新的例外方法cl_demo_output=>next_section( title = '捕获例外,正确方式:' ).TRY.CALL METHOD gc_test->test_new_right( EXPORTING iv_error = '1' ).CATCH zcx_test_exception INTO lo_ref.    "可以捕获特定的异常类lv_msg = lo_ref->get_text( ).cl_demo_output=>write( '捕获类中的例外:' && lv_msg ).ENDTRY.
*带有消息的例外.TRY.CALL METHOD gc_test->test_new_right( EXPORTING iv_error = '2' ).CATCH cx_root INTO DATA(lo_ref_root).    "也可以捕获这个所有错误类的根类lv_msg = lo_ref_root->get_text( ).cl_demo_output=>write( '捕获类中的例外:' && lv_msg ).ENDTRY.*使用通用异常类cl_demo_output=>next_section( title = '捕获例外,正确方式(通用异常类ZCX_BC_COMM):' ).TRY.CALL METHOD gc_test->test_comm( EXPORTING iv_error = '1' ).CATCH zcx_bc_comm INTO DATA(lo_ref_comm).    "可以捕获特定的异常类lv_msg = lo_ref_comm->get_text( ).cl_demo_output=>write( '捕获类中的例外:' && lv_msg ).ENDTRY.
*带有消息的例外.TRY.CALL METHOD gc_test->test_comm( EXPORTING iv_error = '2' ).CATCH cx_root INTO DATA(lo_ref_comm_root).    "也可以捕获这个所有异常类的根类lv_msg = lo_ref_comm_root->get_text( ).cl_demo_output=>write( '捕获类中的例外:' && lv_msg ).ENDTRY.cl_demo_output=>display( ).

ZCL_TEST_EXCEPTION

class ZCL_TEST_EXCEPTION definitionpublicfinalcreate public .public section.methods CONSTRUCTOR .methods TEST_OLDimporting!IV_ERROR type CLIKEexceptionsERROR_1ERROR_2ERROR_3 .methods TEST_NEWimporting!IV_ERROR type CLIKE .methods TEST_NEW_RIGHTimporting!IV_ERROR type CLIKEraisingZCX_TEST_EXCEPTION .methods TEST_COMMimporting!IV_ERROR type CLIKEraisingZCX_BC_COMM .
protected section.
private section.
ENDCLASS.CLASS ZCL_TEST_EXCEPTION IMPLEMENTATION.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_TEST_EXCEPTION->CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>method CONSTRUCTOR.endmethod.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_TEST_EXCEPTION->TEST_COMM
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_ERROR                       TYPE        CLIKE
* | [!CX!] ZCX_BC_COMM
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD test_comm.CASE iv_error.WHEN '1'. "测试文本DATA:lv_str TYPE string.lv_str = '测试文本消息内容'.RAISE EXCEPTION TYPE zcx_bc_commEXPORTINGerror_text = lv_str.WHEN '2'. "测试消息DATA: ls_syst TYPE syst.ls_syst-msgty = 'E'.ls_syst-msgid = '00'.ls_syst-msgno = '001'.ls_syst-msgv1 = '测试SYST消息'.RAISE EXCEPTION TYPE zcx_bc_commEXPORTINGsyst_at_raise = ls_syst.ENDCASE.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_TEST_EXCEPTION->TEST_NEW
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_ERROR                       TYPE        CLIKE
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD test_new.DATA: lv_textid TYPE scx_t100key.CASE iv_error.WHEN '1'.RAISE EXCEPTION TYPE zcx_test_exception.WHEN '2'.lv_textid-msgid = '00'.lv_textid-msgno = '001'.lv_textid-attr1 = '测试异常类消息'.
*        LV_TEXTID-ATTR2
*        LV_TEXTID-ATTR3
*        LV_TEXTID-ATTR4RAISE EXCEPTION TYPE zcx_test_exceptionEXPORTINGtextid = lv_textid
*           previous =.ENDCASE.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_TEST_EXCEPTION->TEST_NEW_RIGHT
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_ERROR                       TYPE        CLIKE
* | [!CX!] ZCX_TEST_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD test_new_right.DATA: lv_textid TYPE scx_t100key.CASE iv_error.WHEN '1'.RAISE EXCEPTION TYPE zcx_test_exception.WHEN '2'.lv_textid-msgid = '00'.lv_textid-msgno = '001'.lv_textid-attr1 = 'IF_T100_DYN_MSG~MSGV1'. "ATTR1放异常类的属性.lv_textid-attr2 = '/把文本放入属性'. "文本放入属性, 最终显示的文本会前后添加 &符号
*        lv_textid-attr3 = '3'.
*        lv_textid-attr4 = '4'.RAISE EXCEPTION TYPE zcx_test_exceptionEXPORTINGtextid = lv_textid
*           previous =.ENDCASE.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_TEST_EXCEPTION->TEST_OLD
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_ERROR                       TYPE        CLIKE
* | [EXC!] ERROR_1
* | [EXC!] ERROR_2
* | [EXC!] ERROR_3
* +--------------------------------------------------------------------------------------</SIGNATURE>method TEST_OLD.CASE IV_ERROR.WHEN '1'.RAISE ERROR_1.WHEN '2'.MESSAGE S001(00) WITH '测试消息S' RAISING ERROR_2.WHEN '3'.MESSAGE E001(00) WITH '测试消息E' RAISING ERROR_3. "与函数一致, 错误消息只会触发异常.不会终止类执行ENDCASE.endmethod.
ENDCLASS.

ABAP基础知识 类的例外处理相关推荐

  1. ABAP基础知识 怎么访问HANA数据库中的其它CATALOG的表

    一 前言 CATALOG 或者SCHEMA 都属于数据库的抽象概念,主要用来解决命名冲突问题. 本文主要讨论怎么在ABAP的环境下访问数据库其它CATALOG中的表. 二 CATALOG VS SCH ...

  2. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  3. ABAP基础知识 内表汇总数据的方式

    点击蓝字 关注我们 一 前言 新开一个专题: ABAP基础知识. 用于介绍一些ABAP中的基础知识.希望可以帮助到一些新学ABAP的朋友.  本文主要介绍ABAP中使用内表统计的几种方式 二 四种统计 ...

  4. kettle对字符串去除空格_整理|ABAP基础知识二:常用字符串处理

    常用字符串处理 上一期整理了ABAP的数据类型和定义,今天我们整理一下开发过程中常见的字符串处理命令.虽然说这些基础知识对于已经熟练使用Ctrl c + Ctrl v的资深码农来说过于简单.但是对于一 ...

  5. SAP ABAP 基础知识

    0:前言 作者是ABAP新手 之前只学过C / JAVA等语言,所以笔记类型偏向于把ABAP的本质知识和C以及JAVA串联起来,在学习的基础上加了一些自己的理解,故希望读者具有C和面向对象的基础,才能 ...

  6. ABAP基础知识概述

    总述 ABAP是Advanced Business Application Programming的简写,即高级的商业应用程序设计(语言),是SAP自有的一种语言. 目录访问方式 ABAP可以通过Tc ...

  7. SAP ABAP基础知识总结图

      在学习了两周的abap开发后,我总结了一个思维导图,知识架构大致如下.

  8. php 类名 属性6,php基础知识(类中属性和方法练习)--2018年9月6日14:01:15

    实例 echo " 类的申明与实例化 "; class test1 { public function hello(){ return "我是一个类"; } } ...

  9. 2021-08-07黑马c++基础知识——类

    面向对象编程的三大特性:封装.继承.多态 具有相同属性(数据结构)和行为(对数据结构的操作)的抽象为类. 封装:将属性和性质封装在一块儿 class类名 { 访问 权限 :属性 | 行为 } 1.访问 ...

最新文章

  1. 关系型数据库到HBase的数据储存方式变迁
  2. linux下踢出已登录用户
  3. JavaScript学习笔记——对象知识点
  4. springboot引入lib包_springboot项目打包引入lib目录下jar包
  5. Asp.Net MVC中的RenderPartial 和 RenderAction 【转】
  6. Python-面向对象的编程语言
  7. 编译源码 JAVA out of memory
  8. PMO在组织结构中的作用
  9. php jwt怎么保存再客户端,php – 如何将JWT添加到授权标头?
  10. GNS 3路由器7200介绍
  11. html颜色转换rgba,RGB颜色在线转换
  12. (一)Redfish简介
  13. 【待续】海思Hi3520A学习笔记
  14. PMP考试须知、注意事项
  15. 上帝永远不会问你的十件事
  16. 揭秘第三方支付包含哪些业务 | 牌照角色篇
  17. Rasa系列教程(二) -- Rasa NLU基础
  18. Photoshop——更改图片比例
  19. linux的dns怎么配置正向区域文件,linux系统下部署DNS正向解析
  20. kubectl cordon 标记节点不可部署Pod SchedulingDisabled uncordon 取消标记

热门文章

  1. HTTP文档传输协议(2)
  2. javaIO——PipedReader 和 PipedWriter 实现模拟即时聊天
  3. 别光顾着学技术,也要抬头看看路
  4. 易语言“非主流”,杀毒软件“躲猫猫”
  5. mysql函桌为之一的_MYSQL必知必会读书笔记第十和十一章之使用函数处
  6. python怎么实现检验_python实现KMO检验和Bartlett's球形检验
  7. 11-6 商品库存和销量修改
  8. 搬家了:http://shallwe2000.cc
  9. html总结(呕心沥血版)
  10. 小程序登录+DouPHP笔记