深入FDO 異常處理機制

2021-05-10 19:33:12 字數 1695 閱讀 8426

fdo

的所有異常類都繼承自fdoexception,但是在fdo 3.5之前fdo只提供了9個異常類,這些異常類的類圖如圖9

‑2所示。

圖 9‑2

fdo異常類類圖從圖

9‑2可以看到,fdo的異常類並不是非常,fdo 3.5已經注意到了這個問題,而且提供了具體的解決方案,訪問http://trac.osgeo.org/fdo/wiki/fdorfc37

可以這個解決方案的具體細節。主要的改進有兩點:

l提供了更多的異常類。

l為類fdoexception增加了乙個方法getnativeerrorcode()用於返回資料來源自身提供的錯誤碼,這樣使用者可以通過錯誤碼知道關於當前異常更加具體的資訊。

class fdoexception

以下是乙個異常的捕獲及處理的例子,需要注意的在捕獲異常之後要記得呼叫異常類的release()方法,否則會造成異常類例項的記憶體洩露。

try

catch (fdocommandexception *ex)

catch (fdoexception *ex)

commands

功能包一般會丟擲fdoconnectionexception型別的異常,connections功能包一般會丟擲fdoconnectionexception型別的異常。但是在在某些情況下,乙個fdo命令在fdo層面丟擲乙個fdoexception,該命令將其捕獲並且把它封裝為fdocommandexception(或者對於模式命令則封裝為fdoschemaexception)。這種情況下,乙個異常就會返回多個異常訊息。以下是處理乙個異常中多個訊息的例子:

catch ( fdoschemaexception* ex )

ex->release();

}在捕獲異常後要注意防止記憶體洩漏,以下便是這樣乙個當有異常發生時及時釋放記憶體的例子。

fdofeatureclass* pbase = null;

try

catch ( fdoexception* e )

catch ( ...)

更好的辦法是通過使用fdoptr來避免記憶體洩露,一旦使用了fdoptr,就無需在捕獲異常後顯式地呼叫某些方法釋放記憶體。

fdoptrpbase = myclass->getbaseclass();

可見合理使用fdoptr不僅可以避免記憶體洩漏,也可以使**簡潔明瞭。

異常訊息是做過本地化的。在windows環境下,本地化的字串存放在資源專用的dll中,它們位於bin目錄下,dll的名字以message或msg為字尾(不是副檔名);而在linux中本地化的字串存放在catalog中,catalog檔案位於/usr/local/fdo-3.2.0/nls目錄下,其命名都以.cat結尾,nls是national language support的縮寫。

在linux下需設定nlspath環境變數以使得應用程式在執行時可以找到訊息的catalog,例如:export nlspath=/usr/local/fdo-3.2.0/nls/%n。

在windows下,無需做任何設定,應用程式可以自動載入這些資源。

異常訊息是經過索引的。當呼叫fdoexception::nlsgetmessage時,需傳入乙個訊息號碼。使用者也可以傳入乙個預設訊息字串,一旦不能找到資源檔案,將返回該預設訊息。如果使用者既沒有指定預設訊息,又不能找到資源檔案,將把訊息號碼作為異常訊息返回。找不到資源檔案的情況一般只會在linux下沒有設定nlspath環境變數時發生。

異常處理機制

異常處理的三個步驟 檢查異常,丟擲異常,處理異常 異常處理基本原理 把需要檢測的程式放到try塊中,把異常處理的程式放在catch塊中。如果執行乙個函式出現了異常,可以丟擲異常資訊。然後查詢try塊下面的catch塊是否可以處理該異常。如果該函式不處理該異常,將傳遞給它的上一級函式 呼叫函式 如果它...

異常處理機制

1 c 中異常處理機制使得異常的引發和異常的處理不必在同乙個函式中。2 異常是專門針對抽象程式設計中的一系列錯誤處理的,c 的函式機制是棧結構,先進後出,依次訪問,無法跳躍。3 異常超脫於函式機制,決定了其對函式的跨越式回跳。4 異常跨越函式 普通用法 基本用法 void add int a,int...

異常處理機制

異常處理機制分為以下2點 異常處理五個關鍵字 try catch finally throw throws 用了try catch程式出現異常不會終止,會丟擲異常繼續執行下面任務 public static void main string args catch error e catch exce...