如果 XMS 在處理方法的呼叫時偵測到錯誤,XMS 會擲出異常狀況。
Exception 類別為這個清單中之其餘每一種類別的超類別。因此, 應用程式可在 try 區塊中包含XMS 方法的呼叫, 若要捕捉所有類型的 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(); // 此處為其他程式碼 } catch(xms::Exception & ex) { // 此處為錯誤處理碼 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); // 此處為其他程式碼 } catch(exception & ex) { // 此處為錯誤處理碼 nRC = -1; } return(nRC); }
在應用程式捕捉 XMS 異常狀況後, 應用程式可使用 Exception 類別的方法來找出錯誤的相關資訊。如需這些方法的定義,請參閱Exception。XMS 異常狀況所封裝的資訊, 本質上和在錯誤區塊中提供給 C 應用程式的相同。如需詳細資訊請參閱錯誤區塊。
如果 XMS 在呼叫期間偵測到多個錯誤, XMS 可針對每一個錯誤各建立一個異常狀況, 並鏈結這些異常狀況,以形成一鏈。在應用程式捕捉到第一個異常狀況後, 應用程式可呼叫 getLinkedException() 方法以取得鏈中之下一個異常狀況的指標。應用程式可繼續對鏈中的每一個異常狀況呼叫 getLinkedException() 方法, 直到傳回空值指標(表示鏈中已無其他異常狀況)為止。
請注意,由於 getLinkedException() 方法會傳回所鏈結之異常狀況的指標, 因此應用程式有責使用 C++ delete 運算子來釋放該物件。
Exception 類別提供的 dump() 方法可讓應用程式以格式化文字形式,將異常狀況傾出至指定的 C++ 輸出串流中。運算子 << 會在 Exception 類別上超載, 且可用在相同用途上。