タイトル

WebOTX コンポーネントから他コンポーネント呼び出しを行う場合の注意事項について

詳細

 

WebOTX 上のサーバコンポーネントから、別のサーバコンポーネントのオペレーション呼び出しを行う場合、オペレーション呼び出し時に CORBA システム例外が発生する(例えば、呼び出し先のオペレーションに障害が発生しており閉塞している)と、env構造体のエラー処理に制御が戻らず(オペレーション呼び出しの次処理が実行されず)、クライアントのアプリケーションに CORBA_NO_MEMORY 例外が発生します。

この現象を回避するためには、TRY PROTECT ~ CATCH 文による構造化例外処理を追加してください。

 
( 例 )  

修正前

RET := &INITIALIZE_STRUCT( env )
RET := SERVER2_Func( obj, ..., &ADDRESS(env) )
IF env.name <> ''
  THEN
    ;// CORBA エラー処理

修正後

RET := &INITIALIZE_STRUCT( env )
TRY
  PROTECT
    RET := SERVER2_Func( obj, ..., &ADDRESS(env) )
  CATCH
    IF env.name <> ''
      THEN
        ;// CORBA エラー処理
      ELSE
        ;// 予期せぬ例外処理

 

【本現象の確認方法】

本現象が発生した場合、サーバコンポーネント(HOLONサーバスタブ)において、TPSUserTrace(LOG_CRIT, "Unknown Exception from ABL.");が実行されます。したがって、Windowsシステムの場合には、イベントビューアに"Unknown Exception from ABL." というメッセージが出力されます。

 

環境 Version HolonEnterprise V6以降
OS Windows、HP-UX、Solaris
補足

 

サーバスタブでは、HOLON 構造化例外の CATCH 漏れを防ぐため、default の CATCH を自動生成しています。この default の CATCH 文に制御が渡ると、クライアントに CORBA_NO_MEMORY 例外を投げて、ユーザにバグを通知するという機能です。

クライアントスタブでは、CORBA システム例外が発生した場合、HOLON 構造化例外を使ったエラー処理を実現するため、該当する CATCH 文をサーチして例外を投げる機能を実装しています。

サーバスタブ上のサーバコンポーネントから、他のサーバコンポーネントを呼び出す(つまり、呼び出すクライアントスタブを使う)場合、呼び出すオペレーションが障害等により閉塞していると CORBA システム例外が発生します。このとき、クライアントスタブは、該当する CATCH 文をサーチするのですが、サーバスタブが自動生成した default の CATCH をサーチして例外を投げます。


 サーバコンポーネントA
 サーバスタブA
    ↑
    ↓
 クライアントスタブA
   (1) CORBA システム例外を検出すると、
   (2) 該当する CATCH 文をサーチするが、
   (3) サーバスタブの default の CATCH にヒットし、
   (4) longjmp する。
 サーバコンポーネントB
 サーバスタブB
   (5) default の CATCH 文(setjmp) に制御が渡され、
   (6) クライアントに CORBA_NO_MEMORY 例外を投げる。
    ↑
    ↓
 クライアントスタブB
   (7) CORBA_NO_MEMORY が捕捉される。


したがって、サーバスタブBにおいてキャッチした例外は、クライアントスタブが THROW したものになります。CORBA システム例外の場合、式を省略した THROW となり、default の CATCH 文に制御を渡すことになります。

 

更新日 2002.10.04