ON ERROR

ストラクチャードモード構文

ON ERROR
  statement
END-ERROR

レポーティングモード構文

ON ERROR

statement

DOstatement DOEND

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

構文図で使用されている記号については、「構文記号」を参照してください。

関連ステートメント:DECIDE FOR | DECIDE ON | IF | IF SELECTION


関数

ON ERROR ステートメントは実行時のエラーを拾い、Natural エラーメッセージを別の形で出力し、Natural プログラムの実行を終了させ、コマンド入力モードに戻すために使用します。

ON ERROR ステートメントブロックの実行が開始されると、プログラムの正常な流れは中断され、再開することはできません。ただし Natural エラー 3145(要求したレコードがホールド状態にある)の場合は、RETRY ステートメントによって処理が中断された所から再開されます。

このステートメントは非手続き型なので、プログラム内の位置ではなくイベントによって実行されます。

制限事項

各 Natural オブジェクト内で 1 回だけ、ON ERROR ステートメントを使用できます。

構文説明

構文要素 説明
statement...
ON ERROR 処理の定義:

ON ERROR 条件が発生したときに実行される処理を定義するには、1 つまたは複数のステートメントを指定できます。

ON ERROR ブロックからの抜け出し

ON ERROR ブロックは、FETCHSTOPTERMINATERETRYESCAPE ROUTINE または ESCAPE MODULE の各ステートメントを使用して、抜け出すことができます。これらのステートメントのいずれかを使用して抜け出さないと、通常のエラーメッセージ処理が行われ、プログラムの実行が終了します。

END-ERROR
ON ERROR ステートメントブロックの終了:

ストラクチャードモードでは、ON ERROR ステートメントブロックを終了するには、Natural の予約語 END-ERROR を使用する必要があります。

レポーティングモードでは、DO ... DOEND ステートメントを使用して 1 つ以上の適切なステートメントを指定し、ON ERROR ステートメントを終了します。単一のステートメントのみを指定する場合は、DO ... DOEND ステートメントを省略できます。よいコーディング習慣に則して、これはお勧めしません。

statement ...
DO statement ... DOEND

異なるレベルにあるオブジェクト内での ON ERROR 処理

CALLNATPERFORM または FETCH RETURN ステートメントによって作成されたオブジェクト呼び出し階層では、各オブジェクトに ON ERROR ステートメントを含めることができます。

エラーが起きた場合、Natural は呼び出し階層をさかのぼり、実行するオブジェクトで最初に見つかった ON ERROR ステートメントを選択します。

詳細については、『プログラミングガイド』の「アプリケーションエラーの処理」を参照してください。

システム変数

次の Natural システム変数は、(次ので示すように)ON ERROR ステートメントと組み合わせて使用できます。

システム変数 説明
*ERROR-NR Natural で検出されたエラーの数が含まれます。
*ERROR-LINE エラーの原因となったステートメントの行番号が含まれます。
*PROGRAM 現在実行中の Natural オブジェクトの名前が格納されます。

** Example 'ONEEX1': ON ERROR                                           
**                                                                      
** 
CAUTION: Executing this example will modify the database records!
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 NAME                                                                
  2 CITY                                                                
*                                                                       
1 #NAME (A20)                                                           
1 #CITY (A20)                                                           
END-DEFINE                                                              
*                                                                       
REPEAT                                                                  
  INPUT 'ENTER NAME:' #NAME                                             
  IF #NAME = ' '                                                        
    STOP                                                                
  END-IF                                                                
  FIND EMPLOY-VIEW WITH NAME = #NAME                                    
    INPUT (AD=M) 'ENTER NEW VALUES:' ///                    
                 'NAME:' NAME /                             
                 'CITY:' CITY                               
    UPDATE                                                  
    END TRANSACTION                                         
    /*                                                      
    ON ERROR                                                
      IF *ERROR-NR = 3009                                   
        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                                         
    /*                                                      
  END-FIND                                                  
END-REPEAT                                                  
END