事件处理程序方法的异常处理

2020-08-31 20:24发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我有一个事件处理程序DELETE_LOCAL_AFTER_COMMIT,其代码如下:

方法delete_local_after_commit。 "行号1
循环到gt_del_obj_tab中INTO DATA(ls_del_obj_tab)。 " object_type
iv_delflag ='X'。
捕获cx_ilm_tadir_api INTO DATA(lx_error)。
引发异常lx_error。 10
ENDTRY。
ENDLOOP。
清除gt_del_obj_tab。
ENDMETHOD。

调用事件处理程序的代码如下:

尝试。
调用方法cl_ilm_tadir_api => delete_local_after_commit。
捕获cx_ilm_tadir_api INTO DATA(lx_error)。 "第18行

ENDTRY。

但是,在第n行中引发了异常。 10未排在第10行。 18.可能出什么问题了? (由于我的方法是事件处理程序,因此我什至无法向其添加异常类)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我有一个事件处理程序DELETE_LOCAL_AFTER_COMMIT,其代码如下:

方法delete_local_after_commit。 "行号1
循环到gt_del_obj_tab中INTO DATA(ls_del_obj_tab)。 " object_type
iv_delflag ='X'。
捕获cx_ilm_tadir_api INTO DATA(lx_error)。
引发异常lx_error。 10
ENDTRY。
ENDLOOP。
清除gt_del_obj_tab。
ENDMETHOD。

调用事件处理程序的代码如下:

尝试。
调用方法cl_ilm_tadir_api => delete_local_after_commit。
捕获cx_ilm_tadir_api INTO DATA(lx_error)。 "第18行

ENDTRY。

但是,在第n行中引发了异常。 10未排在第10行。 18.可能出什么问题了? (由于我的方法是事件处理程序,因此我什至无法向其添加异常类)

付费偷看设置
发送
5条回答
能不能别闹
1楼-- · 2020-08-31 21:00

可能您从CX_STATIC_CHECK或CX_DYNAMIC_CHECK继承了异常类,然后将其包装到CX_SY_NO_HANDLER类的异常中,因为[CLASS-] EVENTS 无法声明RAISING

ABAP文档-事件处理程序中基于类的异常中对此进行了解释

仅不包装从CX_NO_CHECK派生的异常类。

下面是测试代码,该代码将在以下三个变量中返回捕获的异常:

测试代码(使用Ctrl + Shift运行 + F10):

报告zzsro_test6b。

 CLASS lcl_situation定义。
   公共部分。
     事件something_happened导出值(异常)类型REF到cx_root。
 ENDCLASS。

 CLASS lcl_situation的实现。
 ENDCLASS。

 CLASS lcl_observer定义。
   公共部分。
     CLASS-METHODS if_something_happened发生的事件lcl_situation IMPORTING异常的something_happened。
 ENDCLASS。

 类别lcl_observer的实现。
   方法if_something_happened。
     RAISE EXCEPTION异常。
   终结法。
 ENDCLASS。

 类别lcx_no_check从cx_no_check继承。
 ENDCLASS。

 CLASS lcx_static_check从cx_static_check继承。
 ENDCLASS。

 类别lcx_dynamic_check从cx_dynamic_check继承。
 ENDCLASS。

 CLASS lcl_app定义。
   公共部分。
     CLASS-METHODS主要。
 ENDCLASS。

 类别lcl_app实施。
   方法主要。
     lcl_observer => if_something_happened(NEW lcx_no_check())。
   终结法。
 ENDCLASS。

 类别ltc_main定义
       用于检测
       持续时间短
       风险级别危害。
   专用部分。
     方法测试进行测试。
 ENDCLASS。

 类别ltc_main的实现。
   方法测试。
     尝试。
         lcl_observer => if_something_happened(NEW lcx_no_check())。
       捕获cx_root INTO DATA(lx_for_no_check)。
     ENDTRY。
     尝试。
         lcl_observer => if_something_happened(NEW lcx_static_check())。
       捕获cx_root INTO DATA(lx_for_static_check)。
     ENDTRY。
     尝试。
         lcl_observer => if_something_happened(NEW lcx_dynamic_check())。
       捕获cx_root INTO DATA(lx_for_dynamic_check)。
     ENDTRY。
     BREAK-POINT。 此处的调试器
   终结法。
 ENDCLASS。
N-Moskvin
2楼-- · 2020-08-31 21:08

我怀疑是否可以使用CALL METHOD来调用事件处理程序...事件处理程序是否可以通过RAISE EVENT"调用"(间接松耦合)

灬番茄
3楼-- · 2020-08-31 21:01

在实际情况下,这是一个RAISE EVENT,它会触发我的事件处理程序。 但这在我的本地测试类中,在这里我试图调用事件处理程序DELETE_LOCAL_AFTER_COMMIT(不执行SET HANDLER ...)

何必丶何苦呢
4楼-- · 2020-08-31 20:45

正如你所说,我错了: 可以使用CALL METHOD调用事件处理程序。

我发布了详细的答案,解释了您的情况可能发生的情况。

哎,真难
5楼-- · 2020-08-31 20:43

您完全问了一个新问题 与上一个无关,也与我的答案无关。

不需要将异常类与消息类相关。 如果使用消息类中的消息创建异常类,则检索相应的msgid和msgno没有问题。 如果您需要更多信息,请提出更多详细信息。

一周热门 更多>