簡體   English   中英

std :: error_code的用例

[英]Use cases for std::error_code

最近我一直在轉換一些庫來使用C ++ 11中的<system_error>工具。

我很難理解std::error_codestd::error_condition的用例。

注意, 我理解差異 - stackoverflow上很多問題可以解決這個問題

基本區別在於std::error_code應該表示系統或平台特定的錯誤,而std::error_condition是API或用戶界面應該返回的抽象錯誤。

好的 - 但是我很難理解為什么我們會在實踐中使用std::error_code 在我看來你要么:

  1. 與一個特定的系統錯誤報告機制處理(如說, errno從POSIX調用返回或什么的,或者說,一個電話getsockoptSO_ERROR在Linux上),你可以很容易地轉換成std::error_condition通過std::errc枚舉,應該是可移植的。

  2. 使用用戶定義的錯誤類別,它代表應用程序級別或業務邏輯錯誤,例如“無效的社會安全號碼”或其他 - 這也是std::error_condition的用例。

  3. 處理一些定義自己的錯誤報告機制的低級接口或庫,例如OpenSSL,在這種情況下,您將直接使用特定於平台的錯誤機制。 在這種情況下,您需要將這些錯誤轉換或映射到std::error_code 但是如果你要經歷將這些特定於平台的錯誤轉換為像std::error_code這樣的通用錯誤的麻煩,為什么不轉換為std::error_condition呢?

此外,由於POSIX系統錯誤應該是可移植的,並且因為它們通過std::errc枚舉與std::error_condition std::errc ,所以我找不到std::error_code任何用例。 大多數Linux / UNIX系統調用都設置了errno ,它應該可以移植映射到std::error_condition

所以,我沒有看到std::error_code任何用例。 那么,我們想要使用std::error_code而不是std::error_condition一些示例用例是什么?

我想知道這一段時間我自己並在這里找到答案。 本質上, error_code用於存儲和傳輸錯誤代碼,而error_condition用於匹配錯誤代碼。

void handle_error(error_code code) {
   if     (code == error_condition1) do_something();
   else if(code == error_condition2) do_something_else();
   else                              do_yet_another_thing();
}

每個error_condition等同於一組error_code ,可能來自不同的error_categories 這樣,無論它們來自哪個子系統,您都可以將某種類型的所有錯誤視為相同。

另一方面, error_code恰好包含它源自的子系統的類別。 這對於調試和報告錯誤很有用:您可能有興趣知道“權限被拒絕”錯誤是由於本地文件系統上的訪問權限不足還是因為http-downloader-library收到的403錯誤,並且可能希望將該詳細信息放在錯誤消息中,但您的程序必須以任一方式中止。

構成等價的內容由類別定義; 如果error_code的類別認為error_condition等價, 或者 error_condition的類別認為error_code等價,則operator==為該對error_conditionerror_code返回true 這樣,您可以從您自己的錯誤類別中獲取error_code ,並使它們等同於某些泛型或系統error_condition

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM