このセクションでは、アプリケーションエラーを処理するために Natural で用意されている 2 つの基本的な方法(デフォルトの処理とアプリケーション固有の処理)について説明します。さらに、アプリケーション固有のエラー処理を有効にするために必要なオプションについて説明します。このオプションでは、Natural
オブジェクト内で ON ERROR ステートメントブロックをコーディングしたり、別のエラートランザクションプログラムを使用したりします。
最後に、このセクションでは、Natural エラー処理動作の構成、エラーに関する情報の取得、アプリケーションエラーの処理またはデバッグを行うために提供される機能の概要について説明します。
このドキュメントでは、以下のトピックについて説明します。
Natural RPC 環境でのエラー処理についての詳細は、『Natural RPC(リモートプロシージャコール)』ドキュメントの「エラー処理」を参照してください。
Natural アプリケーションでエラーが発生した場合、Natural はデフォルトで次のように処理を続行します。
Natural が、現在実行中のアプリケーションオブジェクトの実行を終了します。
Natural がエラーメッセージを発行します。
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 ステートメントブロックから抜け出るには、次のいずれかのステートメントを指定します。
アプリケーションの実行は現在のレベルで再開されます。
エラー処理が完了したとみなされ、上位レベルでアプリケーションの実行が再開されます。
エラー処理が完了したとみなされ、"フェッチ"プログラムが実行されます。
Natural は影響を受けるプログラムの実行を停止し、アプリケーションを終了してコマンド入力モードに戻ります。
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 オブジェクト内で、ASSIGN、COMPUTE または 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 プロファイルパラメータ SYNERR が ON に設定されている場合、エラートランザクションプログラムも制御を受け取ります。
エラートランザクションプログラムは、現在ログオンしているライブラリ内、または現在の STEPLIB ライブラリ内に存在している必要があります。
エラーが発生した場合、Natural では STACK TOP DATA ステートメントを実行し、スタックの先頭に次の情報を配置します。
| スタックデータ | フォーマット/長さ | 説明 | |
|---|---|---|---|
| Error number | N4 | Natural エラー番号。
注意: |
|
| Line number | N4 | エラーが発生した行番号。
ステータスが |
|
| ステータス | A1 | ステータスコード: | |
C |
コマンド処理エラー | ||
L |
ログオン処理エラー | ||
O |
オブジェクト(実行)時間エラー | ||
R |
リモートサーバー(Natural RPC 関連)でのエラー | ||
S |
構文エラー | ||
| Object name | A8 | エラーが発生した Natural オブジェクトの名前。 | |
| レベル番号 | N2 | エラーが発生した、Natural オブジェクトのレベル番号。
コンパイル時に Natural 構文エラーが発生し、プロファイルパラメータ Natural ランタイムエラーが発生し、Natural オブジェクトのレベル番号が |
|
Natural ランタイムエラーが発生し、Natural オブジェクトのレベル番号が 99 より大きい場合:
|
|||
| レベル番号拡張済み | I4 | 現在のレベル番号(最大 512)。 | |
コンパイル時に Natural 構文エラーが発生し、プロファイルパラメータ SYNERR が ON に設定されている場合:
|
|||
| エラーの位置 | 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 は、次のようなさまざまなエラー処理関連の機能を提供しています。
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」を参照してください。 |
...
/*
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
/*
...
...
*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 アプリケーションプログラミングインターフェイス」を参照してください。