Analyzing Runtime Errors

Objective

After completing this lesson, you will be able to 分析运行时错误

ABAP 短转储

调试需求

无法解决程序出错这一事实。但是,它们以不同的方式表现出来。当用户启动错误的应用程序时,它可能会崩溃,可能会发生意外情况,或者根本不会发生任何情况。从用户的角度来看,在用户界面级别,无法仅说明发生此错误的方式和原因。

作为开发人员,您现在需要更加仔细地逐行检查程序,以仅确定不同程序变量中的哪些语句和值组合导致错误。这是调试器发挥作用的地方。

运行时错误

ABAP 代码包含除以零的语句

编写 ABAP 代码时定期执行语法检查非常重要。但是,正确的语法并不总是意味着程序将在运行时成功执行。

例如,程序中的计算可能会导致问题,具体取决于使用的值。"语法正确的程序可能存在问题"一图演示了一个程序,虽然语法正确,但会导致运行时错误。

ABAP 短转储

截屏:包含错误相关信息的短转储

如果运行时环境遇到无法执行的语句,则会终止程序并触发运行时错误。每个运行时错误都由名称标识并分配给特定的错误情况。如果未捕获运行时错误,运行时环境将终止程序。自 ABAP 7.53 起,ABAP 运行时错误可在 ABAP 运行时错误查看器中显示。

可以使用不同的入口点打开 ABAP 运行时错误查看器:

  • 如果运行 ABAP 应用程序时发生错误,则会在右下角显示一个对话框。选择显示以显示错误。
  • 源读取器 视图中,双击运行时错误条目。

从工具栏中,您可以导航到发生转储的源代码位置,并将链接共享到转储。

“导航到源代码”和“共享链接以进行转储”按钮的屏幕截图
右键单击短转储中的源代码后,上下文菜单的屏幕截图

编辑器底部有三个选项卡:

  1. 第一个提供下列信息:

    • 抬头信息
    • 错误分析
    • 程序终止位置的相关信息
    • 源代码提取
    • 突出显示发生错误的行;选择行以导航到源代码中的错误
    • 活动调用/事件
  2. 长文本标签提供完整的转储信息。它支持概述和快速大纲功能(键盘上的 Ctrl+ O)。

  3. 未格式化显示 标签以仅特殊分析情况所需的技术格式提供转储信息。

短转储还允许您直接导航到 ABAP 调试器,以便在发生运行时错误之前查看变量的值。

运行时错误正常。在开发程序时,您可能会经常遇到这些问题。但是,尝试防止它们是非常重要的。如果生产系统中的用户看到运行时错误(如图中的错误),则用户可能会感到困惑。用户可能无法理解对 ABAP 应用程序和显示的技术信息的引用。

避免运行时错误

显示具有条件分支的方法的逻辑流的图表,以避免短转储
实施含条件分支的方法示例,以避免短转储

在上述示例中,添加了逻辑以避免除以零运行时错误。

使用条件逻辑避免运行时错误

业务示例

您的一位同事创建了一个程序,用于计算每年剩余每月的平均剩余假期天数。另一位同事提到,当当年没有剩余月份时,节目表现奇怪。测试程序并进行必要的更改,以确保它在所有情况下都有效。

注意

在本练习中,XX 指的是您的编号。

步骤

  1. 在包中,创建名称为 ZCL_XX_DUMP 的新 ABAP 类。确保使用接口 IF_OO_ADT_CLASSRUN。当提示您将类分配到传输请求时,请使用在上一个任务中创建的传输请求。

    1. 选择 文件新建ABAP 类

    2. 输入您的包 ZS4D100_XX。 

    3. 输入名称 ZCL_XX_DUMP 并输入类的描述。

    4. 选择添加...(位于 接口 组框旁)。

    5. 输入过滤器文本 IF_OO_ADT_CLASSRUN。双击搜索结果清单中的匹配条目。

    6. 选择下一步

    7. 选择 从我参与的请求和您自己的传输请求中选择

    8. 选择完成

  2. if_oo_adt_classrun~main() 中添加以下代码:

    1. 在编辑器中,在 METHOD if_oo_adt_classrun~mainENDMETHOD 之间输入以下编码。

      Code Snippet
      123456
      DATA: lv_mths TYPE i VALUE 10, "No. of months remaining in year lv_hols TYPE i VALUE 20, "No. of days untaken vacation lv_avg_hols TYPE i. lv_avg_hols = lv_hols / lv_mths. out->write( |Average vacation days per month { lv_avg_hols }| ).
  3. 激活并测试类。

    1. 使用键盘快捷键 Ctrl + F3 激活类。

    2. 使用 F9 键运行类。

    结果

    该程序输出每月剩余假期天数的平均值。
  4. 更改测试程序,检查结果中如果该年还剩 0 个月,并且员工有 20 个未使用的假期。

    1. lv_mths 的值设置为 0

    2. 选择 Activate (Ctrl+F3)

    3. 选择 F9 运行该程序。

    结果

    程序终止并显示运行时错误的详细信息。
  5. 分析运行时错误以识别问题。为什么出现错误?

    1. 选择 F9 运行该程序。

    2. Eclipse 将在右下方显示标题为 ABAP 运行时错误的弹出窗口。

    3. 单击显示链接分析错误。

    4. 向下翻页查看发生的情况以及导致错误的行。

    发生该错误是因为在数学上无法除以零。

  6. 切换到 ABAP 编辑器。

    1. 选择标签 ZCL_S4D100_XX_DUMP

  7. 为防止出现运行时错误,请实施条件,以便程序输出以下文本(如果没有剩余月份):请询问您是否可以展期剩余休假。否则,执行计算并像以前一样输出结果。

    1. 围绕现有计算添加以下代码:

      Code Snippet
      123456
      IF lv_mths NE 0. lv_avg_hols = lv_hols / lv_mths. out->write( |Average vacation days per month { lv_avg_hols }| ). ELSE. out->write( |Please ask to roll over remaining vacation| ). ENDIF.
    2. 现在,激活并测试程序。

      Code Snippet
      1234567891011121314151617181920212223242526
      * Full Solution Code CLASS zcl_s4d100_dump DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_oo_adt_classrun . PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS zcl_s4d100_dump IMPLEMENTATION. METHOD if_oo_adt_classrun~main. DATA: lv_mths TYPE i VALUE 0, "No. of months remaining in year lv_hols TYPE i VALUE 10, "No. of days untaken vacation lv_avg_hols TYPE i. IF lv_mths <> 0. lv_avg_hols = lv_hols / lv_mths. out->write( |Average vacation days per month { lv_avg_hols }| ). ELSE. out->write( |Please ask to roll over remaining vacation!| ). ENDIF. ENDMETHOD. ENDCLASS.

      实践