アプリケーションエラーの処理

このセクションでは、アプリケーションエラーを処理するために Natural で用意されている 2 つの基本的な方法(デフォルトの処理とアプリケーション固有の処理)について説明します。さらに、アプリケーション固有のエラー処理を有効にするために必要なオプションについて説明します。このオプションでは、Natural オブジェクト内で ON ERROR ステートメントブロックをコーディングしたり、別のエラートランザクションプログラムを使用したりします。

最後に、このセクションでは、Natural エラー処理動作の構成、エラーに関する情報の取得、アプリケーションエラーの処理またはデバッグを行うために提供される機能の概要について説明します。

このドキュメントでは、以下のトピックについて説明します。

Natural RPC 環境でのエラー処理についての詳細は、『Natural RPC(リモートプロシージャコール)』ドキュメントの「エラー処理」を参照してください。


Natural のデフォルトエラー処理

Natural アプリケーションでエラーが発生した場合、Natural はデフォルトで次のように処理を続行します。

  1. Natural が、現在実行中のアプリケーションオブジェクトの実行を終了します。

  2. Natural がエラーメッセージを発行します。

  3. Natural がコマンド入力モードに戻ります。

"コマンド入力モード"では、Natural コンフィグレーションに基づき、Natural メインメニュー、NEXT コマンドプロンプト、またはユーザー定義のスタートアップメニューが表示されます。

表示されるエラーメッセージには、Natural エラー番号、対応するメッセージテキスト、影響を受ける Natural オブジェクト、およびエラーが発生した行番号が含まれます。

エラーが発生した後、影響を受けるアプリケーションオブジェクトの実行が終了するため、保留中のデータベーストランザクションのステータスは、プロファイルパラメータ ETEOPの設定によって要求されるアクションの影響を受ける場合があります。これらのパラメータの設定の結果として Natural が END TRANSACTION ステートメントを発行していない限り、Natural がコマンド入力モードに戻ると BACKOUT TRANSACTION ステートメントが発行されます。

アプリケーション固有のエラーの処理

Natural では、デフォルトのエラー処理がアプリケーションの要件を満たしていない場合にエラー処理を修正できます。アプリケーション固有のエラーの処理を設定する場合、次のような理由が考えられます。

  • エラーに関する情報を、アプリケーション開発者が詳細に分析できるよう保存する。

  • 可能であれば、エラー復旧後もアプリケーションの実行を継続する。

  • 特定のトランザクション処理が必要である。

アプリケーションエラーが発生した後に、影響を受ける Natural アプリケーションオブジェクトの実行が終了するため、保留中のデータベーストランザクションのステータスは、プロファイルパラメータ ETEOPの設定によってトリガされるアクションの影響を受ける場合があります。そのため、アプリケーションのエラー処理によって、さらにトランザクション処理(END TRANSACTION ステートメントまたは BACKOUT TRANSACTION ステートメント)を実行する必要があります。

アプリケーション固有のエラー処理を有効にするには、次のオプションがあります。

  • Natural オブジェクト内で ON ERROR ステートメントブロックをコーディングできます。

  • 別のエラートランザクションプログラムを使用することもできます。

これらのオプションについては、次のセクションで説明します。

ON ERROR ステートメントブロックの使用

ON ERROR ステートメントを使用して、エラーが発生したアプリケーション内の実行時のエラーをインターセプトすることができます。

ON ERROR ステートメントブロック内から、現在のレベルまたは上位レベルでアプリケーションの実行を再開できます。

さらに、下位レベルで発生したエラーを処理するために、アプリケーションの複数のオブジェクトに ON ERROR ステートメントを指定できます。したがって、アプリケーション固有のエラーの処理は、アプリケーションのニーズに合わせて正確に適合させることができます。

ON ERROR ステートメントブロックからの抜け出し

ON ERROR ステートメントブロックから抜け出るには、次のいずれかのステートメントを指定します。

  • RETRY

    アプリケーションの実行は現在のレベルで再開されます。

  • ESCAPE ROUTINE

    エラー処理が完了したとみなされ、上位レベルでアプリケーションの実行が再開されます。

  • FETCH

    エラー処理が完了したとみなされ、"フェッチ"プログラムが実行されます。

    STOP

    Natural は影響を受けるプログラムの実行を停止し、アプリケーションを終了してコマンド入力モードに戻ります。

  • TERMINATE

    Natural アプリケーションの実行が停止し、Natural セッションも終了します。

エラー処理ルール

  • ON ERROR ステートメントブロックの実行がこれらのステートメントのいずれかによって終了しない場合、エラーは上位レベルの Natural オブジェクトに関連付けられ、そこに存在する ON ERROR ステートメントブロックによって処理されます。

  • 上位レベルのいずれの Natural オブジェクトにも ON ERROR ステートメントブロックが含まれていない場合でも、エラートランザクションプログラムが指定されていると(次のセクションを参照)、このエラートランザクションプログラムは制御を受け取ります。

  • 上位レベルのいずれの Natural オブジェクトにも ON ERROR ステートメントブロックが含まれておらず、エラートランザクションプログラムが指定されていない場合は、前述のように Natural のデフォルトエラー処理が実行されます。

エラートランザクションプログラムの使用

エラートランザクションプログラムは、以下の場所で指定できます。

  • ETA プロファイルパラメータ。

  • Natural Security がインストールされている場合は、Natural Security ライブラリプロファイル内にあります。『Natural Security』ドキュメントの「Components of a Library Profile」を参照してください。

  • Natural オブジェクト内で、ASSIGNCOMPUTE または MOVE ステートメントを使用して、システム変数 *ERROR-TA に対する値として、エラー条件が発生したときに制御を受け取るプログラムの名前を割り当てることで、この指定が可能です。

Natural セッション中にエラートランザクションプログラムの名前をシステム変数 *ERROR-TA に割り当てると、プロファイルパラメータ ETA を使用して指定されたエラートランザクションプログラムの代わりに、名前を割り当てたプログラムを使用できます。ETA プロファイルパラメータを使用するか、システム変数 *ERROR-TA に値を割り当てるかにかかわらず、エラートランザクションプログラム名は、コール階層の異なるレベルに対して Natural により保存および復元されることはありません。したがって、Natural オブジェクトのシステム変数 *ERROR-TA に名前を割り当てると、指定したプログラムが呼び出され、割り当て後に現在の Natural セッションで発生するエラーが処理されます。

プロファイルパラメータ ETA を使用してエラートランザクションプログラムを指定する場合、Natural オブジェクトの個々の割り当てを必要とせずに、完全な Natural セッションに対してエラートランザクションが定義されます。それに対して、システム変数 *ERROR-TA にプログラムを割り当てる場合はより柔軟性があり、例えば、さまざまなアプリケーションブランチで異なるエラートランザクションプログラムを使用することができます。

システム変数 *ERROR-TA が空白にリセットされると、前述のように Natural のデフォルトエラー処理が実行されます。

エラートランザクションプログラムが指定され、アプリケーションエラーが発生した場合、アプリケーションの実行は終了し、指定されたエラートランザクションプログラムが制御を受け取り、以下の処理を実行します。

  • エラーを分析します。

  • エラー情報を記録します。

  • Natural セッションを終了します。

  • FETCH ステートメントを使用してプログラムを呼び出し、アプリケーションの実行を続行します。

エラートランザクションプログラムは、コマンドプロンプトから呼び出された場合と同じ方法で制御を受け取るため、エラーが発生した時点でアクティブだった Natural オブジェクトでアプリケーションの実行を再開することはできません。

構文エラーが発生し、Natural プロファイルパラメータ SYNERRON に設定されている場合、エラートランザクションプログラムも制御を受け取ります。

エラートランザクションプログラムは、現在ログオンしているライブラリ内、または現在の STEPLIB ライブラリ内に存在している必要があります。

エラーが発生した場合、Natural では STACK TOP DATA ステートメントを実行し、スタックの先頭に次の情報を配置します。

スタックデータ フォーマット/長さ 説明
Error number N4 Natural エラー番号。

注意:
セッションパラメータ SGON に設定されている場合、フォーマット/長さは N5 になります。

Line number N4 エラーが発生した行番号。

ステータスが C または Lの場合、行番号は 0 です。

ステータス A1 ステータスコード:
C コマンド処理エラー
L ログオン処理エラー
O オブジェクト(実行)時間エラー
R リモートサーバー(Natural RPC 関連)でのエラー
S 構文エラー
Object name A8 エラーが発生した Natural オブジェクトの名前。
レベル番号 N2 エラーが発生した、Natural オブジェクトのレベル番号。

コンパイル時に Natural 構文エラーが発生し、プロファイルパラメータ SYNERRON に設定されている場合、レベル番号はゼロになります。

Natural ランタイムエラーが発生し、Natural オブジェクトのレベル番号が 99 より大きい場合、値 99 はスタックされます。現在の値は、追加のスタックデータ"レベル番号拡張済み"にスタックされます。

Natural ランタイムエラーが発生し、Natural オブジェクトのレベル番号が 99 より大きい場合:
レベル番号拡張済み I4 現在のレベル番号(最大 512)。
コンパイル時に Natural 構文エラーが発生し、プロファイルパラメータ SYNERRON に設定されている場合:
エラーの位置 N3 ソース行内の障害のある項目の位置。
項目の長さ N3 障害のある項目の長さ。

この情報は、INPUT ステートメントを使用してエラートランザクションプログラムで取得できます。

例:

DEFINE DATA LOCAL                                                   
1 #ERROR-NR           (N5)                                          
1 #LINE               (N4)                                          
1 #STATUS-CODE        (A1)                                          
1 #PROGRAM            (A8)                                          
1 #LEVEL              (N2)                                          
1 #LEVELI4            (I4)
1 #POSITION-IN-LINE   (N3)                                          
1 #LENGTH-OF-ITEM     (N3)                                          
END-DEFINE                                                          
IF *DATA > 6 THEN       /* SYNERR = ON and a syntax error occurred 
  INPUT                                                             
    #ERROR-NR                                                       
    #LINE                                                           
    #STATUS-CODE                                                    
    #PROGRAM                                                        
    #LEVEL                                                          
    #POSITION-IN-LINE                                               
    #LENGTH-OF-ITEM                                             
ELSE                                                                
  INPUT                 /* other error                             
    #ERROR-NR                                                       
    #LINE                                                           
    #STATUS-CODE                                                    
    #PROGRAM                                                        
    #LEVEL                                                          
    #LEVELI4
END-IF                                                              
WRITE #STATUS-CODE                                                  
* DECIDE ON FIRST VALUE OF STATUS-CODE                              
*  ... /* process error                                             
* END-DECIDE                                                        
END

スタックの上部に格納された情報の一部は、ON ERROR ステートメントブロックで使用可能な複数のシステム変数の内容と等価です。

スタックデータ ON ERROR ステートメントブロックの等価なシステム変数
Error number *ERROR-NR
Line number *ERROR-LINE
Object name *PROGRAM
レベル番号 *LEVEL

Natural Security 環境でのルール

Natural Security がインストールされている場合は、ログオンエラーの処理に関する追加ルールが適用されます。詳細については、『Natural Security』ドキュメントの「トランザクション」を参照してください。

エラー処理関連の機能

Natural は、次のようなさまざまなエラー処理関連の機能を提供しています。

  • Natural のエラー処理動作を構成する機能。

  • 発生したエラーに関する情報を取得するのに役立つ機能。

  • こうしたエラーの処理をサポートする機能。

  • アプリケーションエラーのデバッグをサポートする機能。

これらの機能は、次のグループに分けることができます。

プロファイルパラメータ

次のプロファイルパラメータは、エラーが発生した場合の Natural の動作に影響します。

プロファイルパラメータ 機能
CPCVERR コードページ変換エラー
ETA エラートランザクションプログラム
ETEOP プログラム終了時の END TRANSACTION の発行
RCFIND FIND ステートメントに対するレスポンスコード 113 の処理
RCGET GET ステートメントに対するレスポンスコード 113 の処理
SYNERR 構文エラーの制御

システム変数

次のアプリケーション関連のシステム変数を使用して、エラーの場所を特定したり、エラー条件が発生した場合に制御を受け取るプログラムの名前を取得/指定したりできます。

システム変数 内容
*ERROR-LINE エラーの原因となったステートメントのソースコード行番号。

例 1」を参照してください。

*ERROR-NR ON ERROR 条件が発生した原因となったエラーのエラー番号。
*ERROR-TA エラー条件が発生したときに制御を受け取るプログラムの名前。

例 2」を参照してください。

*LEVEL エラーが発生した、Natural オブジェクトのレベル番号。
*LIBRARY-ID ユーザーが現在ログオンしているライブラリの名前。
*PROGRAM 現在実行中の Natural オブジェクトの名前。

例 1」を参照してください。

例 1

...
    /*                                                      
    ON ERROR                                                
      IF *ERROR-NR = 3009 THEN                                 
        WRITE 'LAST TRANSACTION NOT SUCCESSFUL'             
            / 'HIT ENTER TO RESTART PROGRAM'                
        FETCH 'ONEEX1'                                      
      END-IF                                                
      WRITE 'ERROR' *ERROR-NR 'OCCURRED IN PROGRAM' *PROGRAM
            'AT LINE' *ERROR-LINE                           
      FETCH 'MENU'                                          
    END-ERROR                                         
    /* 
...

例 2:

...
    *ERROR-TA := 'ERRORTA1' 
    /* from now on, program ERRORTA1 will be invoked 
    /* to process application errors
...
    MOVE 'ERRORTA2' TO *ERROR-TA
    /* change error transaction program to ERRORTA2
...

これらのシステム変数の詳細については、『システム変数』ドキュメントの対応するセクションを参照してください。

端末コマンド

次の端末コマンドは、エラーが発生した場合の Natural 動作に影響を与えます。

端末コマンド 機能
%E= エラー処理を有効または無効にする

システムコマンド

次のシステムコマンドは、エラー状況に関する追加情報を提供したり、データベースコールのデバッグまたはログに使用するユーティリティを呼び出したりします。

システムコマンド 機能
LASTMSG 最後に発生したエラー状況に関する追加情報を表示します。
TECH Natural セッションに関する技術的な情報やその他の情報(最後に発生したエラーに関する情報など)を表示します。

アプリケーションプログラミングインターフェイス

一般的に、エラー状況に関する追加情報を取得したり、エラートランザクションをインストールしたりするために、以下のアプリケーションプログラミングインターフェイス(API)を使用できます。

API 機能
USR0040N 最後のエラーのタイプを取得
USR1016N ネスト構造のコピーコードのエラーのエラーレベルを取得
USR2001N 最後のエラーに関する情報を取得
USR2006N エラーメッセージコレクタから情報を取得
USR2007N RPC デフォルトサーバーのデータを取得または設定
USR2010N 最後のデータベースコールのエラー情報を取得
USR2026N TECH 情報を取得
USR2030N 最後のエラーからダイナミックエラーメッセージ部分を取得
USR3320N ユーザーショートエラーメッセージを検索(STEPLIB 検索を含む)
USR4214N プログラムレベル情報を取得

詳細については、『ユーティリティ』ドキュメントの「SYSEXT - Natural アプリケーションプログラミングインターフェイス」を参照してください。