バージョン 4.2.5
 —  ステートメント  —

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

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

Top of page

制限事項

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

Top of page

構文説明

statement...
ON ERROR 処理の定義:

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

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

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

END-ERROR Natural 予約語 END-ERROR を使用して、ON ERROR ステートメントブロックを終了させる必要があります。

Top of page

サブルーチン内の ON ERROR 処理

CALLNATPERFORM または FETCH RETURN を使用したサブルーチン構成になっている場合、各モジュールに ON ERROR ステートメントが指定可能です。

エラーが起きた場合、Natural は自動的にサブルーチン構成に従って戻り、実行中のサブルーチン内で最初に見つかった ON ERROR ステートメントを選択します。 ON ERROR ステートメントがどのレベルのどのモジュールにもない場合は、通常のエラーメッセージ処理を行い、プログラムの実行が終了します。

Top of page

システム変数 *ERROR-NR および *ERROR-LINE

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

*ERROR-NR Natural で検出されたエラーの数が含まれます。
*ERROR-LINE エラーの原因となったステートメントの行番号が含まれます。

Top of page

** 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

Top of page