2017-08-24 199 views
4

因此,在我瞭解std::error_code如何運作的旅程中,我開始懷疑我們是否真的需要std::error_conditionstd::error_category。我試圖實現thisthis教程中的內容,並且工作量並非易碎,而且相當脆弱(我目前一直在試圖弄清楚爲什麼此代碼會導致鏈接錯誤與重複符號有關。我們真的需要std :: error_category和std :: error_condition嗎?

是不是更容易繼承std::error_code,加message財產&方法,然後讓std::error_code相媲美,其中錯誤代碼定義枚舉?我掙扎理解爲什麼我需要std::error_categorystd::error_condition可言。

+2

在C++中有多種處理錯誤的方法,沒有一種真正的方法。如果你不需要它,不要使用它。 –

回答

5

主要優點是error_code是可複製的類型,可以從圖書館到圖書館wi不必涉及任何動態內存分配或模板,使其非常輕便,並且易於使用。

如果你正在編寫一個完全獨立的項目,那麼是的,當你只有自己的類型時,錯誤代碼和類別似乎過於複雜。

但是,編寫一個圖書館意味着要被其他人使用時(比如ASIO,因爲你鏈接了think-async.com),事情就會改變。您可以讓一個庫接收一個error_code實例,並且它可以乾淨而高效地傳遞它,而無需瞭解使用該庫的代碼的任何內容,或者必須使每個錯誤處理函數都在錯誤上進行模板化類型。

在這種情況下,錯誤類別在處理多個錯誤源時很重要,因爲給定的錯誤代碼可能意味着基於錯誤來源的兩種不同的事情。

編輯:請注意,在您的第一個鏈接,類別實際上是單身人士。這是在保持輕量級的服務中完成的,因爲將指針複製到保證永不被刪除或修改的對象是便宜的,內存安全的和線程安全的。

+1

我想補充一點,它也可以很容易地通過像std :: system_error這樣的標準異常類型傳輸自定義錯誤代碼。使用您的庫的客戶端代碼不需要知道有關您的自定義錯誤類別的任何信息。他們可以通過調用'std :: error_code'的* generic *方法來捕獲'std :: system_error',他們可以將它寫入日誌文件,其中錯誤值,您定義的錯誤類別的名稱以及將顯示您在錯誤類別中定義的字符串消息。比輸出「錯誤代碼123」好得多,在這裏沒有人知道它屬於哪個上下文。 – zett42

相關問題