Exception 如何捕获未分配的运行时错误DATREF\u?

Exception 如何捕获未分配的运行时错误DATREF\u?,exception,abap,Exception,Abap,在ABAP中是否可以使用TRY-catch子句捕获未分配的DATREF_ 未分配的DATREF属于ABAP编程错误类别,这意味着: ABAP程序中的错误,如被零除或未捕获的可捕获异常 问题:修改以下代码以捕获未分配的DATREF\u: data gv_i type ref to i. gv_i->*17. 此错误的简单处理方法是: data gv_i type ref to i. if gv_i is initial. gv_i = new #( ). endif. gv_i->

在ABAP中是否可以使用TRY-catch子句捕获未分配的DATREF_

未分配的DATREF属于ABAP编程错误类别,这意味着: ABAP程序中的错误,如被零除或未捕获的可捕获异常

问题:修改以下代码以捕获未分配的DATREF\u:

data gv_i type ref to i.
gv_i->*17.
此错误的简单处理方法是:

data gv_i type ref to i.
if gv_i is initial.
  gv_i = new #( ).
endif.
gv_i->*17.
所需的解决方案将使用TRY-CATCH或其他构造来处理异常/错误。以下代码不起作用:

data gv_i type ref to i.
try.
  gv_i->* = 17.
catch CX_ROOT.
  gv_i = new #( ).
endtry.

您无法捕获未分配的DATREF\u

委员会确认:

如果数据引用变量包含空引用,则在使用解引用运算符时,将引发未分配的异常DATREF

使用
未绑定
检查空引用:

data gv_i type ref to i.
if gv_i is not bound.
  gv_i = new #( ).
endif.
gv_i->*17.

您不能处理这样的异常,因为它纯粹是一个需要修复的编程错误

即使是
CATCH SYSTEM-EXCEPTIONS OTHERS=8
也无济于事

REPORT zzz.

START-OF-SELECTION.
  DATA gv_i TYPE REF TO i.
  CATCH SYSTEM-EXCEPTIONS OTHERS = 8.
    gv_i->* = 17.
  ENDCATCH.
  IF sy-subrc <> 0.
    gv_i = NEW #( ).
  ENDIF.
报告zzz。
开始选择。
数据gv_i类型参考至i。
捕获系统异常-其他=8。
gv_i->*=17。
收尾。
如果sy subrc为0。
gv#u i=新的#()。
恩迪夫。

注意,如果gv_i为初始值,则使用
的处理不会覆盖绑定数据被释放时的所有情况(引用将没有绑定数据,但引用也不是初始值)。如果gv_i未绑定,则使用
进行处理
涵盖所有情况。