[英]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 > 0
或i < 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*/}
}
在此示例中,它包含更多的代碼,但是在我的真實項目中,它將減少代碼量,因為我使用了大量多維數組並對多個維進行邊界檢查。
從某種意義上說,它不會起作用沒有問題,僅此而已。 使用異常進行基本流控制 (這似乎是您在此處所做的事情)通常會因為某種原因而被皺眉 ,而且我認為我從未在循環中看到過這樣的情況:
現在看一下實際的代碼會很有趣,但是我懷疑它可能不需要任何邊界檢查,例如通過使循環從1而不是0開始。 或者,如果這是遞歸模式,則可以編寫一個輔助函數(或使用現有的on)進行迭代,並在一次迭代中訪問多個元素。 那將減少代碼量,這實際上是值得的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.