XMS がメソッドの呼び出しを処理しているときにエラーを検出すると、XMS は例外をスローします。
Exception クラスは、このリストの残りの各クラスのスーパークラスです。このため、アプリケーションは XMS メソッドの呼び出しを try ブロックに組み込むことができます。また、XMS 例外のすべてのタイプをキャッチするため、アプリケーションは catch 構文の例外宣言に Exception クラスをそのまま指定できます。 次のコード・フラグメントは、この技法を示しています。
#include <xms.hpp> using namespace std; int main(int argc, char *argv[]) { int nRC = 0; try { xms::ConnectionFactory connFact; xms::Connection conn; connFact.setIntProperty(XMSC_CONNECTION_TYPE, XMSC_CT_RTT); connFact.setIntProperty(XMSC_RTT_CONNECTION_PROTOCOL, XMSC_RTT_CP_TCP); connFact.setStringProperty(XMSC_RTT_HOST_NAME, "localhost"); connFact.setIntProperty(XMSC_RTT_PORT, 1506); conn = connFact.createConnection(); // Other code here } catch(xms::Exception & ex) { // Error handling code here nRC = -1; } return(nRC); }
アプリケーションがこの技法を使用して XMS 例外をキャッチする場合、アプリケーションは値によってではなく、参照によって例外をキャッチする必要があることに注意してください。 こうすることにより、例外がスライスされることがなくなり、エラーに関する有用なデータを失うことがなくなります。
Exception クラス自体は、std::exception クラスのサブクラスです。 したがって、C++ ランタイム環境によってスローされた例外を含むすべての例外をキャッチするため、アプリケーションは catch 構文の例外宣言に std::exception クラスをそのまま指定できます。 次のコード・フラグメントは、この点を示しています。
#include <xms.hpp> using namespace std; int main(int argc, char *argv[]) { int nRC = 0; try { xms::ConnectionFactory connFact; connFact.setIntProperty(XMSC_CONNECTION_TYPE, XMSC_CT_RTT); connFact.setIntProperty(XMSC_RTT_CONNECTION_PROTOCOL, XMSC_RTT_CP_TCP); connFact.setStringProperty(XMSC_RTT_HOST_NAME, "localhost"); connFact.setIntProperty(XMSC_RTT_PORT, 1506); // Additional code here } catch(exception & ex) { // Error handling code here nRC = -1; } return(nRC); }
アプリケーションは、XMS 例外をキャッチしたら、Exception クラスのメソッドを使用してエラーに関する情報を検索できます。 これらのメソッドの定義については、Exceptionを参照してください。 XMS 例外によってカプセル化された情報は、エラー・ブロックで C アプリケーションに提供されている情報と実質的には同じです。この情報の詳細については、エラー・ブロックを参照してください。
1 回の呼び出し中に XMS が複数のエラーを検出した場合、XMS は、 エラーごとに例外を作成して例外同士を連結し、チェーンを形成できます。 アプリケーションは、最初の例外をキャッチした後、getLinkedException() メソッドを呼び出して、チェーン内の次の例外を指すポインターを取得します。 アプリケーションは、チェーン内にこれ以上例外がないことを示す NULL ポインターが戻されるまで、チェーン内の各例外に対して getLinkedException() メソッドを呼び出し続けることができます。
getLinkedException() メソッドは連結された例外を指すポインターを戻すため、C++ の delete 演算子を使用してオブジェクトを解放するのは、アプリケーション側の役目です。
Exception クラスには dump() メソッドが用意されています。アプリケーションは、このメソッドを使用することにより、例外をフォーマット済みテキストとして、指定の C++ 出力ストリームにダンプできます。 演算子 << は Exception クラスに多重定義され、同じ目的に使用できます。