5.2.4 システム例外のキャッチ

アプリケーションは,VisiBroker ORBとリモートコールをトライキャッチブロックで囲むのがよいでしょう。「4. Borland Enterprise Server VisiBrokerによるサンプルアプリケーションの開発」で説明したアカウントのクライアントプログラムがC++の例外をどのように出力するのかを,コードサンプル5-5でわかりやすく説明します。コードサンプル5-6は,アカウントクライアントプログラムがJavaの例外をどのように出力するかを示します。

コードサンプル5-5 例外の出力(C++)

#include "Bank_c.hh"
int main(int argc, char* const* argv) {
  try {
     CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
     PortableServer::ObjectId_var managerId =
           PortableServer::string_to_ObjectId("BankManager");
     Bank::AccountManager_var manager =
           Bank::AccountManager::_bind("/bank_agent_poa",
                 managerId);
     const char* name = argc >1 ? argv [1] : "Jack B. Quick";
     Bank::Account_var account = manager->open(name);
     CORBA::Float balance = account->balance();
     cout << "The balance in " << name << "'s account is $"
           << balance << endl;
  } catch(const CORBA::Exception& e) {
    cerr << e << endl;
    return 1;
  }
  return 0;
}

コードサンプル5-6 例外の出力(Java)

public class Client {
  public static void main(String[ ] args) {
     try {
        org.omg.CORBA.ORB orb =
                        org.omg.CORBA.ORB.init(args, null);
        byte[ ] managerId = "BankManager".getBytes();
        Bank.AccountManager manager =
              Bank.AccountManagerHelper.bind(orb,
                                         "/bank_agent_poa",
                                         managerId);
        String name =
                args.length > 0 ? args[0] : "Jack B. Quick";
        Bank.Account account = manager.open(name);
        float balance = account.balance();
        System.out.println("The balance in "
                     + name + "'s account is $" + balance);
    } catch (Exception e) {
        System.err.println(e);
    }
  }
}

上記のような変更を加えたクライアントプログラムをサーバが存在しない場合に実行するときは,次のような出力が行われ,オペレーションが未完であることと,例外の理由を示します。

C++の場合

prompt> Client
Exception: CORBA::OBJECT_NOT_EXIST
        Minor: 0
        Completion Status: NO

Javaの場合

prompt>vbj Client
org.omg.CORBA.OBJECT_NOT_EXIST:
     Could not locate the following POA:
     poa name : /bank_agent_poa
     minor code:0 completed: No