お久しぶりのKudoです。
今回はエラーハンドラーの実装で躓いたC#とJavaの違いについて投稿です。
先に「エラーハンドラー(Error_handler)」とはなんぞや?という人に説明を
エラーハンドラーはGeneXus内で使用することができるDB用のエラーハンドリング(エラー処理)ルールです。
イベントでエラー時に実行したい処理をSubルーチンとして記述し
ルールでError_handlerルールを利用して先ほどのSubルーチンを呼びます
これだけです。
他の言語に比べたらとても楽なんですがDBのエラーしか拾ってこないんですよね・・・
さて、本題ですがこのエラーハンドラーには様々なパラメータがあることをご存知でしょうか?
GeneXusWikiで調べたことがある人はこのページを見た事があると思います
基本的には、エラーの内容や原因を特定するための値ですが1つだけ、処理を制御する変数が存在します、それが
&gxErrOpt
です
この変数、Wikiの説明を見るだけだとC#とJavaで違いが発生するようには見えないのですが
実は、発生してしまうんです。
例として次のSubルーチンが存在します。
1 2 3 4 |
Sub 'Error_Handler' msg("DBエラーが発生しました") Return EndSub |
C#でこのルーチンが実行された場合、画面に「DBエラーが発生しました」と表示され、システム上は正常に処理が行われます。
しかし!
Javaではサーバー側のエラーとして処理され、HTTPレスポンスで500が帰ってきてしまい、システムが落ちてしまいます。
そして、この動作の差異の原因こそ&gxErrOptなのです。
ですので、ここで&gxErrOptを0にするように処理を直すと・・・
1 2 3 4 5 |
Sub 'Error_Handler' &gxErrOpt = 0 msg("DBエラーが発生しました") Return EndSub |
これだけでJavaでもC#と同じ動作を行うようになります。