[英]Use cases for std::error_code
最近我一直在轉換一些庫來使用C ++ 11中的<system_error>
工具。
我很難理解std::error_code
與std::error_condition
的用例。
注意, 我理解差異 - stackoverflow上有很多問題可以解決這個問題 。
基本區別在於std::error_code
應該表示系統或平台特定的錯誤,而std::error_condition
是API或用戶界面應該返回的抽象錯誤。
好的 - 但是我很難理解為什么我們會在實踐中使用std::error_code
。 在我看來你要么:
與一個特定的系統錯誤報告機制處理(如說, errno
從POSIX調用返回或什么的,或者說,一個電話getsockopt
與SO_ERROR
在Linux上),你可以很容易地轉換成std::error_condition
通過std::errc
枚舉,應該是可移植的。
使用用戶定義的錯誤類別,它代表應用程序級別或業務邏輯錯誤,例如“無效的社會安全號碼”或其他 - 這也是std::error_condition
的用例。
處理一些定義自己的錯誤報告機制的低級接口或庫,例如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_condition
和error_code
返回true
。 這樣,您可以從您自己的錯誤類別中獲取error_code
,並使它們等同於某些泛型或系統error_condition
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.