2017-08-25 51 views
3

我正在開發一個與遠程系統交談的庫,當它返回有限且已知數量的錯誤代碼時,消息可能以不可預知的方式更改。std :: error_category是否可用於動態消息?

所以我是exploringstd::error_code作爲一種方式爲我的庫的用戶提供一種處理C++原生錯誤的方法,而不是推出我自己的代碼。我不能拋出異常。

Tutorials使用std::error_category總是顯示靜態實例與根據錯誤代碼返回的硬編碼消息一起使用。

但是如果我們有無法緩存的動態消息呢?我們如何將特定消息鏈接到std::error_code的特定實例?

+0

沒有人使用'std :: error_code'。 – o11c

+0

@ o11c他們應該tho。 – ruipacheco

回答

1

簡答:你不能這樣做。

error_code意味着是一個能夠複製值類型。如果允許自定義消息,則複製錯誤將涉及執行消息數據的深層副本,或者維護一個ref-count。

這會使錯誤代碼太重,無法在許多應用程序/庫內部循環中使用,基本上迫使程序員對該代碼部分使用不同的錯誤處理機制,從而使得error_code基本上毫無意義。

你可以通過使用線程本地錯誤狀態來解決這個問題(比如舊學校errno),但是我建議不要這樣做,因爲它會阻止你在任何時間長度內存儲錯誤。

+0

除了std :: error_code和異常之外,還有處理錯誤的C++方法嗎? – ruipacheco

+0

@ruipacheco好的! C++是一種足夠靈活的語言,無論您提出什麼錯誤處理方案都可能是可實現的。我個人非常喜歡Andrei Alexandrescu的「預期」計劃,但我還沒有看到它用於製作。 – Frank

+0

@ruipacheco我的經驗是,失敗的原因通常只對調試更有用,因此返回一個簡單的成功/失敗狀態以及在故障站點上的簡單的「寫入日誌」通常是您所需要的,真。 – Frank

相關問題