プログラムの実行時にデータベースに関連するエラーが発生した場合に、ユーザーが独自の処置を取れるようにします。
Error_Handler(‘subname'
);
入力値の説明: subname
このルールを使用するプログラムに含まれるサブルーチンの名前です。
適用範囲
オブジェクト: Procedure、
Transaction、
Web Panel ジェネレーター: .NET、
.NET Framework、
Java
説明
このルールを使用することにより、トランザクションエラーや接続エラーが発生すると、ユーザー定義のルーチンが実行されます。
これは、アクティブな error_handler コマンドがなければ、プログラム全体のどこにでも適用できる宣言型ルールです。
ルール/コマンドの適用範囲は、これを使用するプログラムでのみ考慮されます。つまり、このルールを使用するプログラムで呼び出されるどのプログラムにも影響しません。このルールを使用するプログラムが別のプログラムを呼び出し、呼び出されたプログラムでも同じルールを使用する場合は、呼び出し元のプログラムに属するルールは、呼び出されたプログラムで無視されるため、プログラムごとにルールを定義する必要があります。つまり、このルールは、それを使用するプログラムのみに制限されます。
error_handler プログラムは、実行時にデータベースに関連するエラーが検知されるたびに呼び出されます。このプログラムは、パラメーターを受け取りませんが、GeneXus に発生したエラーを識別するために、次の &err
標準変数を使用できます:
名前
|
データタイプ
|
説明
|
&Err
|
Numeric(3)
|
GeneXus の標準エラーコードや、未定義のデータベース エラー コードを検知した場合の 999 を含みます。エラーを識別できるようにするには、この変数を使用することを強くお勧めします。GeneXus の別のプラットフォームにプログラムに移植しやすくなります。次のリストに、&Err の値およびそれらの意味 (&Errmsg 変数に割り当てることできる) を示します。
1 レコードが重複しています。
101 ファイルの最後です。
103 オブジェクトがロックされています (レコードまたはファイル)。
105 オブジェクトが見つかりません。
106 データベースが既に存在します。
500 親の主キーが見つかりません。
600 参照整合性エラーが発生しました (Java ジェネレーターのみ)。
999 予期しない DBMS エラーの発生です。
|
また、次の変数を定義して、データベースに由来するエラーコードと説明に関する詳細情報を受け取ることができます:
名前
|
データタイプ
|
説明
|
&gxDBErr
|
Numeric(5)
|
ネイティブの DBMS エラーコードを含みます。&Err が 500 より大きい場合のみ値が設定されます。それ以外の場合は、未定義になります。
|
&GxDbSqlState |
Character(5)
|
ネイティブの SQLSate エラーコードを含みます。 |
&gxDBTxt
|
Character(255)
|
ネイティブの DBMS エラーメッセージを含みます。&Err が 500 より大きい場合のみ値が設定されます。それ以外の場合は、未定義になります。
|
&gxOper
|
Character(30)
|
エラーを検知した時点で実行中だった操作の説明を含みます。この変数の値は、次のいずれかです: Declare、Fetch、Insert、Update、Delete
|
&gxErrTbl
|
Character(30)
|
エラーが発生したときにアクセスしていたテーブル (ある場合) の名前を含みます。データベースの操作 (データベースの作成やリモートプロシージャーの呼び出しなど) に関連するテーブルがない場合は、「N/A」という特別な値が含まれます。
|
&gxErrOpt
|
Numeric(1)
|
error_handler によって返されるコード。error_handler で設定された値によって、プログラムで行われる動作が異なります。
0 = 処理を継続します: エラーが無視されます。 1 = 操作を再試行します: [ Lock retry count ] プロパティを使用して、指定された回数試行します。再試行してもエラーが継続する場合は、処理を続行します。 2 = アプリケーションの実行をキャンセルします: SQL エラーが発生すると、アプリケーションをキャンセルします。 3 = GeneXus の既定の処理を実行します: これが既定値です。エラー処理のないプログラムと同じように動作します。つまり、一部のエラーはロックや重複などとして無視され、その他のエラーはアプリケーションの実行をキャンセルします。
考慮事項:
- &gxErrOpt が 0 または 1 に設定されている場合、GeneXus で生成されたコードで取得されているため、標準出力ではエラーは表示されません。
- error_handler ルールによって呼び出されるサブルーチン内で Return コマンドが実行される場合、オブジェクトの実行を終了し、呼び出し元に戻ります。この場合、&gxErrOpt の値に従ってエラーを処理するコードは実行されません。 そのため、&gxErrOpt に割り当てられた値に関係なく、アプリケーションはキャンセルされません。つまり、&gxErrOpt = 2 または &gxErrOpt = 3 を割り当てても、error_handler ルールによって呼び出されるサブルーチン内で Return コマンドが実行された場合、アプリケーションはキャンセルされません。
|
注:
- これらの変数は、error_handler ルールまたはコマンドを持つ各オブジェクトで使用できます。
- すべての DBMS の例外は、error_handler ルールまたはコマンドによってキャッチされます。標準変数は次の場合にロードされます:
- &gxDBErr および &gxDBTxt は、どのような場合でもロードされます。
- &gxDBSqlState は、次でロードされます:
- Java
- .NET Framework:
- .NET:
次のように定義されている
Transaction オブジェクトがあるとします:
ルール:
error_handler('DBErrors');
イベント:
Sub 'DBErrors'
If &Err = 1
Msg('Duplicate record')
Endif
EndSub
error_handler コマンド