我需要編寫C++ API,它由從DLL的暴露幾個出口的C++類,使用.lib文件(MSVC)。從我的另一個問題的答案我明白,導出的類方法不能使用異常,如果C++ API內置在一個VC++版本(比如說2010),並且客戶端代碼寫入另一個VC++版本。由於異常不能成爲公共API接口的一部分,我正在尋找另一個錯誤處理策略。我的限制:我不想使用COM,而豐富的錯誤代碼系統(如HRESULT)對我來說還不夠。我想擁有包含錯誤代碼,錯誤消息和我需要的任何其他信息的異常類。另外,我不想爲每個VC++版本單獨構建。C++ API設計和錯誤處理
我目前的做法如下。每個公共類方法都返回枚舉值(如ErrorCode)。在該方法失敗的情況下,像GetLastErrorInfo這樣的靜態函數將返回指向C++類的指針(假設ErrorInfo),該指針包含覆蓋範圍錯誤信息。 ErrorInfo保留爲線程特定數據,幷包含當前線程中最後一次調用的錯誤信息。如果最後一次API調用成功,則GetErrorInfo返回NULL。
考慮以下代碼有例外:
try { classPtr->DoSomething(); cout << classPtr->GetData() << endl; } catch(const MyException& ex) { cout << ex.GetErrorMessage() << endl; return; }
沒有例外,它看起來像這樣:
ErrorCode result; int data; result = classPtr->DoSomething(); if (result != Success) { cout << MyClass::GetLastErrorInfo()->GetErrorMessage() << endl; return; } result = classPtr->GetData(data); if (result != Success) { cout << MyClass::GetLastErrorInfo()->GetErrorMessage() << endl; return; } cout << data << endl;
這看起來並不好。 Class接口很麻煩:現在每個函數都有ErrorCode返回類型。返回值成爲輸出參數。是否有更好的方法,允許達到錯誤信息,並保持清潔的公共API接口?
你可以使用boost :: tuple來獲得多個返回類型並避免整個輸出參數。但這只是真正的問題的破解 – Lalaland 2012-01-29 15:18:02
也如何創建內聯包裝函數來解釋錯誤代碼並拋出異常。我可以想到兩種方法來做到這一點。 1.客戶端包裝(myFunction)。 2.客戶端執行myFunction,並且myFunction是封裝(internalMyFunction)。使用元組和模板元編程通過包裝器傳遞其他返回類型。 – Lalaland 2012-01-29 15:21:31
可能的解決方案是在內部保留最後的錯誤,每種方法都會更新它。因此,類方法不需要返回錯誤。還有一種方法可以訪問最後一個錯誤代碼。當然,在多線程訪問的情況下,解決方案會更復雜 – Eugene 2012-01-29 15:47:04