if (userRequest = "A") try add record1; onException myErrorHandler(12); end end
一般に、try ブロックによって、エラーが生じた場合でもプログラムで処理を継続することができます。
try ブロックには、以前に示した onException 文節 が含まれていることがあります。この文節は、try ブロック内の以前の文のいずれかが失敗した場合に呼び出されますが、onException 文節がない場合は、try ブロック内のエラーによって、その try ブロックの直後の最初の文が呼び出されます。
EGL は、実行時の問題について特定の性質を示すために、一連のシステム例外を備えています。これらの例外は、それぞれが 1 つの辞書になっており、そこから情報を取り出すことができますが、取り出しには、常にシステム変数 SysLib.currentException (これも辞書) を使用します。この変数により、実行単位内でスローされた最新の例外にアクセスできます。
if (userRequest = "A") try add record1; onException case (SysLib.currentException.code) when (FileIOException) myErrorHandler(12); otherwise myErrorHandler(15); end end end
この場合、FileIOException は「com.ibm.egl.FileIOException」というストリング値に相当する定数です。 EGL 例外定数は常に、「com.ibm.egl」で始まるストリング内の最後の修飾子と等価です。
例外フィールドへのアクセスは、onException ブロック内でのみ行うことを強くお勧めします。例外が発生しなかったときに、コードが SysLib.currentException にアクセスすると、実行単位は終了します。
if (userRequest = "A") try add record01; onException case (SysLib.currentException.code) when ("com.ibm.egl.SQLException") if (SysLib.currentException.sqlcode == -270) myErrorHandler(16); else myErrorHandler(20); end otherwise myErrorHandler(15); end end end
システム例外の詳細については、『EGL システム例外』を参照してください。
try ブロックの存在によって、数値オーバーフローの処理が影響を受けることはありません。この種のエラーの詳細については、『VGVar.handleOverflow』を参照してください。
if (userRequest = "B") try myVariable = myABC(); onException myErrorHandler(12); end end
EGL は、正常なイベントの応答または終了しないエラーの応答として、try ブロックに設定されたエラー関連システム変数を提供します。これらの変数の値は、try ブロック内およびその try ブロックに後続して実行されるコード内で使用でき、大抵の場合、値は変換後にリストアされます。
EGL ランタイムは、文が try ブロックの外部で実行されるときに、エラー関連変数の値を変更しません。ただし、ユーザーのプログラムは、try ブロック外部のエラー関連変数に値を割り当てることができます。
try ブロック内で無限のエラーが生じた場合、sysVar.exceptionCode の値は、エラーが try ブロックの外部で生じた場合にユーザーに提示される EGL エラー・メッセージの数値コンポーネントと同一の値です。ただし、sysVar.errorCode や VGVar.mqConditionCode など、状態固有の変数の値は、ランタイム・システムによって提供されます。エラーがない場合、sysVar.exceptionCode の値と、少なくとも 1 つの状態特定変数とは、同じ 8 つのゼロのストリングです。
エラー・コードは、『VGVar.handleOverflow』の説明にあるように、無限の数値オーバーフローの場合、sysVar.exceptionCode および sysVar.errorCode に割り当てられます。しかし、正常な算術計算がエラー関連システム変数に影響を与えることはありません。
エラー値が sysVar.exceptionCode に割り当てられた場合、システム変数 sysVar.exceptionMsg には関連した EGL エラー・メッセージのテキストが割り当てられ、システム変数 sysVar.exceptionMsgCount には エラー・メッセージ内のバイト数 (末尾ブランクおよび NULL を除く) が割り当てられます。8 つのゼロのストリングが sysVar.exceptionCode に割り当てられた場合、sysVar.exceptionMsg はブランクが割り当てられ、sysVar.exceptionMsgCount はゼロに設定されます。
この変数のデフォルト設定は、handleHardIOErrors プロパティーの値によって異なり、このプロパティーは、プログラム、ライブラリー、pageHandler などの生成可能ロジック・パーツの中で使用可能です。このプロパティーのデフォルト値は yes で、これは、変数 VGVar.handleHardIOErrors の初期値を 1 に設定します。
ハードまたはソフトのいずれかの入出力エラーが try ブロック外部で生じた場合、生成したプログラムは可能な場合はエラー・メッセージを提示してから、終了します。
DB2® に直接アクセスしている場合 (JDBC 経由でなく)、ハード・エラーの sqlcode は 304、802、または 0 より小さい値です。
recordName is IOerrorValue recordName not IOerrorValue
入出力エラー値が指定された論理式を使用しないでデータベース管理システムを変更する場合は、プログラムの変更と再生成が必要になることがあります。特に、JDBC を使用している場合は、sysVar.sqlcode または sysVar.sqlState の値、または、sysVar.sqlca 内の同等の値ではなく、入出力エラー値を使用して、エラーの有無をテストすることをお勧めします。JDBC を使用しているとき、それらの値は、基盤となるデータベース実装によって異なります。