我習慣于老式編程,其中函式回傳 0 表示成功,非零表示錯誤,并且可以使用
if ( ! myobject.mymethod() ) {
handle error
}
所以我目前使用 C 17(盡管我可以前進或后退)并選擇讓大量方法回傳一個列舉。
所以現在編譯器抱怨沒有!操作員。很公平。 但是,避免讓人打字的標準做法是什么:
if ( myobject.mymethod() != ReturnCode::Success ) {
handle error
}
我認為這使代碼更難讀寫,從而增加了總擁有成本 (TCO)?
只是我正在考慮的一些事情:
operator!(bool)為我在職業生涯中撰寫的所有此類列舉定義一個。但我不記得曾在其他代碼中看到過這一點。改為使用 int 的前處理器定義,并回傳它們(盡管在除錯器中無法理解錯誤 5 是有代價的,并且必須搜索標頭以查看 5 的含義
盡管我認為例外對于我的需求來說太大了
uj5u.com熱心網友回復:
如果您使用簡單的列舉使用 0 作為成功,那么您可以撰寫如下代碼:
if(!functionCall())
error handling
或者您可以閱讀有關 std::error_code 的資訊,它具有 bool 運算子
uj5u.com熱心網友回復:
我會爭辯說
if ( myobject.mymethod() != ReturnCode::Success ) {
handle error
}
比代碼更清晰,更不容易出錯
if ( ! myobject.mymethod() ) {
handle error
}
在前者中,從閱讀此代碼可以清楚地看出該塊正在處理不成功的情況。
在后者中,您不知道該塊是在處理成功還是錯誤或其他事情,程式員很容易混淆。
您實際上自己證明了這一點,您撰寫回傳0(false) 是成功,但您的代碼將其視為失敗。
所以不要害怕更冗長的代碼,因為這可以幫助你避免這樣的錯誤。
uj5u.com熱心網友回復:
更改enum class為enum允許自動(隱式)轉換為整數,而整數又可以用作布林值而無需進一步作業。
無范圍列舉型別的值可以隱式轉換為整數型別。
這種無范圍的列舉型別是您通過使用 定義列舉獲得的enum。
相反,我通過使用enum class.
https://en.cppreference.com/w/cpp/language/enum
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/511334.html
標籤:C 错误处理
