簡體   English   中英

使用std :: out_of_range的邏輯不好嗎?

[英]Is using std::out_of_range for logic bad?

在我的項目中,我有很多這樣的情況:

constexpr size_t element_count = 42;
std::array<bool, element_count> elements;

for(size_t i = 0; i < element_count; ++i){
    if(i > 0 && elements[i - 1]){/*do something*/}
    else{/*do something else*/}
    if(i < element_count - 1 && elements[i + 1]){/*do something*/}
    else{/*do something else*/}
}

如果不檢查i > 0i < element_count ,我將得到未定義的行為。 如果我使用std::array::at代替operator[] ,則可以獲取std::out_of_range異常。 我想知道僅依靠這樣的異常是否有任何問題:

for(size_t i = 0; i < element_count; ++i){
    try{
        if(elements.at(i - 1)){/*do something*/}
    }
    catch(const std::out_of_range& e){/*do something else*/}
    try{
        if(elements.at(i + 1)){/*do something*/}
    }
    catch(const std::out_of_range& e){/*do something else*/}
}

在此示例中,它包含更多的代碼,但是在我的真實項目中,它將減少代碼量,因為我使用了大量多維數組並對多個維進行邊界檢查。

從某種意義上說,它不會起作用沒有問題,僅此而已。 使用異常進行基本流控制 (這似乎是您在此處所做的事情)通常會因為某種原因而被皺眉 ,而且我認為我從未在循環中看到過這樣的情況:

  • 使得對代碼的閱讀和推理更加困難,也因為這出乎意料,有人使用異常進行流控制(而不是錯誤處理,這是C ++的意思)
  • 較難閱讀通常也意味着較難編寫,並且更難發現錯誤
  • 您實際上已經犯了一個錯誤,或者至少引入了一個行為更改:i> 0 && elements [i-1]評估為false不會再導致“其他”問題
  • 如果減少代碼量會導致可讀性差或更糟糕的代碼,那么不再是一個好目標
  • 可能表現不佳

現在看一下實際的代碼會很有趣,但是我懷疑它可能不需要任何邊界檢查,例如通過使循環從1而不是0開始。 或者,如果這是遞歸模式,則可以編寫一個輔助函數(或使用現有的on)進行迭代,並在一次迭代中訪問多個元素。 那將減少代碼量,這實際上是值得的。

暫無
暫無

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

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