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