对于程序员来说,在调试器里单步调试,是一个强有力的排错工具。
但很多时候,我们从界面上看到了错误消息,但是不知道在哪里设置断点来调试,也就是找不到问题的突破口。
这个时候,Exception breakpoint 就成为了我们的好帮手。
通过一个具体的例子来说明。
假设我用 BSP 开发了一个 Web 应用。下图表格每个列,绑定到了 BOL model node.
我们仔细观察上图,第一行的最后一列,associated object 是空的。理论上来说,这是因为方法 GET_ASSOC_OBJ_DEF_ATTRIB
的实现出了问题。
所以我在该方法上设置了一个断点并开始调试。 令我惊讶的是,我发现第一行没有触发断点,而是按照我的预期触发了左边的第二、三、四行……。 为什么框架不调用我的第一行的 getter 方法? 然后我计划调试 BSP 框架,以了解第二行的 getter 方法是如何调用的。 经过一段时间与框架代码的斗争后,我改变了主意,因为我发现这不是调试复杂框架代码的有效方法。
我确实相信后端发生了一些异常,但被框架捕获了。 我在搜索按钮实现中设置了一个断点,因为可以肯定的是,异常仅在执行搜索后发生。
我动态创建一个新的异常。 由于我不知道异常的确切名称,我只能基于 CX_ROOT 创建断点,CX_ROOT 是 ABAP 里所有基于类的异常的超类。
那么我能做的就是按 F8、F8、F8……很快(十秒后)我发现一个可疑方法 GET_TABLE_CONTENT 中引发了一个异常。
点击 Display Trigger Location
, 然后调试器定位到 GET_P_ASSOC_OBJ_DEF_ATTRIB
方法,指向了异常 CX_SY_NO_HANDLER
:
在SAP ABAP编程中,异常 CX_SY_NO_HANDLER 是一种运行时异常,通常在异常处理过程中出现。这个异常表示在程序执行期间,没有找到适当的异常处理程序。具体而言,当系统无法匹配已发生异常的类型与任何现有的异常处理程序时,就会引发 CX_SY_NO_HANDLER 异常。
异常的含义:
- 未捕获的异常:CX_SY_NO_HANDLER 是未被捕获的异常。这意味着在程序的异常处理块中找不到能够处理特定异常类型的处理程序。
- 程序中断:当发生 CX_SY_NO_HANDLER 异常时,程序将被中断,并且系统会记录异常信息,以便进行调试和分析。
- 异常类型不匹配:通常,这个异常是由于异常类型与任何 CATCH 块中定义的异常类型不匹配而引起的。系统会搜索匹配的异常处理程序,但如果找不到,就会抛出这个异常。