有没有一种有效的方法来避免实例化带有语法错误的类?

ACu*_*ind 5 sap abap

您可能知道,拥有包含语法错误的类的活动代码非常容易(例如,有人激活了该代码而忽略了语法警告,或者有人更改了该类调用的方法的签名)。

这意味着还可以通过

CREATE OBJECT my_object TYPE (class_name).
Run Code Online (Sandbox Code Playgroud)

将失败,并出现明显无法捕获的SYNTAX_ERROR异常。目标是编写在发生这种情况时不会终止的代码。

已知解决方案:

  1. 将CREATE OBJECT语句包装在RFC函数模块中,以目标NONE调用该模块,然后从RFC调用中捕获(经典)异常SYSTEM_FAILURE。如果RFC成功,则实际创建对象(您不能将创建的对象传递到RFC之外,因为据我所知,RFC功能模块无法传递引用,并且只能通过引用传递对象)。

    由于RFC调用产生了一个全新的LUW,因此该解决方案不仅笨拙,而且还会严重影响性能。另外,您实际上并没有阻止SYNTAX_ERROR转储,只是让它转入您不关心的线程中。它仍然会令人讨厌地显示在ST22中。

  2. 在尝试实例化该类之前,请致电

    cl_abap_typedescr=>describe_by_name( class_name )
    
    Run Code Online (Sandbox Code Playgroud)

    并捕获当它尝试描述的代码具有语法错误时引发的基于类的异常CX_SY_RTTI_SYNTAX_ERROR。

    与RFC变体相比,此方法的性能要好得多,但似乎仍会增加不必要的开销-通常,我不希望describe_by_name返回类型信息,我只是调用它来获取可捕获的异常,而当它成功时,其结果是扔掉。

有没有办法防止SYNTAX_ERROR转储而不增加这种开销?

Flo*_*ian 4

我们能想到的最有效的方法是:

\n\n
METHODS has_correct_syntax\n  IMPORTING\n    class_name    TYPE seoclsname\n  RETURNING\n    VALUE(result) TYPE abap_bool.\n\nMETHOD has_correct_syntax.\n  DATA(include_name) = cl_oo_classname_service=>get_cs_name( class_name ).\n  READ REPORT include_name INTO DATA(source_code).\n  SYNTAX-CHECK FOR source_code MESSAGE DATA(message) LINE DATA(line) WORD DATA(word).\n  result = xsdbool( sy-subrc = 0 ).\nENDMETHOD.\n
Run Code Online (Sandbox Code Playgroud)\n\n

加载程序和语法检查仍然有很多开销。但是,至少没有额外的内容用于编译您不感兴趣的描述符。

\n\n

我们调查了何时生成一个依赖管理器,该管理器在启动时将类连接在一起,并且应该排除语法错误的候选者。

\n\n

CS包含并不总是存在,因此get_cs_name可能会返回空。似乎取决于 NetWeaver 版本和开发人员使用的编辑器。

\n\n

如果您确定语法错误是由classes\xe2\x80\x99自己的代码引起的,您可能需要考虑缓冲语法检查的结果,并且仅在上次检查后类发生更改时重新验证。如果您预计语法错误是由这些类之外的某些内容引起的,则此方法不起作用。

\n