Analyzing Runtime Errors

Objective

After completing this lesson, you will be able to 実行時エラーの分析

ABAP ショートダンプ

デバッグの必要性

プログラムでは、エラーの発生はつきものです。エラーは、さまざまな方法で出現します。ユーザが問題のあるアプリケーションを起動すると、クラッシュする場合も、予期しない問題が発生する場合も、何も起こらない場合もあります。ユーザの観点からは、エラーが何故、どのように発生したかをユーザインタフェースレベルで簡潔に伝えることは不可能です。

開発者として、実際にプログラムを 1 行ずつ詳細に調べて、さまざまなプログラム変数のどの命令と値の組合せでエラーが発生したかを判断する必要があります。そこで、登場するのがデバッガです。

実行時エラー

ゼロで除算される命令を含む ABAP コード

ABAP コードの記述時には、構文チェックを定期的に実行することが重要です。ただし、構文が正しいとしても、プログラムが実行時に正常に実行されるとは限りません。

たとえば、プログラム内の計算によって、使用される値に応じて問題が発生する可能性があります。図 "構文的に正しいプログラムには問題があるかどうか" は、構文的に正しいにもかかわらず実行時エラーが発生するプログラムを示しています。

ABAP ショートダンプ

スクリーンショット:エラーに関する情報を含むショートダンプ

実行時環境で実行できない命令が検出されると、プログラムは強制終了され、実行時エラーがトリガされます。各実行時エラーは名称によって識別され、特定のエラー状況に割り当てられます。実行時エラーが捕捉されない場合、実行時環境によってプログラムが強制終了します。ABAP 7.53 以降では、ABAP 実行時エラーを ABAP 実行時エラービューアに表示することができます。

ABAP 実行時エラービューアは、さまざまなエントリポイントを使用して開くことができます。

  • ABAP アプリケーションの実行中にエラーが発生した場合は、右下隅にダイアログが表示されます。表示を選択してエラーを照会します。
  • フィードリーダビューで、実行時エラーエントリをダブルクリックします。

ツールバーから、ダンプが発生したソースコードの位置にナビゲートし、ダンプへのリンクを共有することができます。

Navigate to source code ボタンと Share link to dump ボタンのスクリーンショット
ショートダンプでソースコードを右クリックした後のコンテキストメニューのスクリーンショット。

エディタの下部には、以下の 3 つのタブがあります。

  1. 最初のでは、以下の情報が提供されます。

    • Header information
    • エラー分析
    • プログラムの強制終了箇所に関する情報
    • ソースコード抜粋
    • エラーが発生した行が強調表示されます。行を選択して、ソースコードのエラーにナビゲートしてください。
    • 有効コール/イベント
  2. テキスト (長) タブには、完全なダンプ情報が表示されます。アウトラインとクイックアウトライン (キーボードの Ctrl+ O) の機能がサポートされています。

  3. 未フォーマット表示タブでは、特別な分析状況でのみ必要な技術書式でダンプ情報が提供されます。

ショートダンプにより、ABAP デバッガに直接ナビゲートして、実行時エラーが発生する直前に変数の値を確認することもできます。

実行時エラーは正常です。これらは、プログラムの開発中に頻繁に発生する場合があります。ただし、それらを防ぐことが重要です。本稼働システムのユーザは、図のエラーなど、実行時エラーが表示されると混乱する可能性があります。ユーザは、ABAP アプリケーションへの参照および提示された技術情報を理解していない可能性があります。

実行時エラーの回避

ショートダンプを回避するための、条件分岐を使用したメソッドの論理フローを示す図
ショートダンプを回避するための、条件分岐によるメソッドの実装例

上記の例では、ゼロ除算の実行時エラーを回避するためのロジックが追加されています。

実行時エラーを回避するための条件ロジックの使用

ビジネスシナリオ

同僚の 1 人が、その年の残りの各月の平均休暇日数を計算するプログラムを作成しました。別の同僚は、年内に月が残っていないときにプログラムが妙に実行されることに言及した。プログラムをテストし、すべての状況でプログラムが機能するように必要な変更を行います。

注記

この演習問題では、XX は各自の番号を示します。

ステップ

  1. パッケージで、ZCL_XX_DUMP という名称の新規 ABAP クラスを登録します。インタフェース IF_OO_ADT_CLASSRUN が使用されていることを確認します。クラスを移送依頼に割り当てるように求められたら、前のタスクで登録した移送依頼を使用します。

    1. FileNewABAP Class を選択します。

    2. パッケージ ZS4D100_XX を入力します。 

    3. 名称 ZCL_XX_DUMP を入力し、クラスの内容説明を入力します。

    4. 追加... を選択します。(インタフェースグループボックスの横)。

    5. フィルタテキスト IF_OO_ADT_CLASSRUN を入力します。該当対象一覧で一致するエントリをダブルクリックします。

    6. Next を選択します。

    7. 自分が関与している依頼および自分の移送依頼から選択を選択します。

    8. Finish を選択します。

  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 Runtime Error というタイトルのポップアップウィンドウが表示されます。

    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.

      実践する