gpt4 book ai didi

c++ - 使用 std::out_of_range 逻辑不好吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:47 25 4
gpt4 key购买 nike

在我的项目中,有很多这样的情况:

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异常(exception)。我想知道仅仅依赖这样的异常是否有任何问题:

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*/}
}

在这个例子中它有更多的代码,但在我的实际项目中它会减少代码量,因为我使用了大量的多维数组并对多个维度进行边界检查。

最佳答案

从某种意义上说,它可以正常工作没有问题,但仅此而已。使用异常 for basic flow control (这就是你在这里所做的)通常是 frowned upon ,有理由,我不认为我曾经在循环中看到过这样的情况:

  • 使代码的阅读和推理变得更加困难,还因为使用异常进行流控制(而不是用于错误处理,这在 C++ 中是用来处理错误的)是出乎意料的。
  • 更难阅读通常也意味着更难编写,并且更难发现错误
  • 你实际上已经犯了一个错误,或者至少引入了一个行为改变:i > 0 && elements[i - 1] 评估为 false 不会导致“其他东西”被调用了
  • 如果减少代码量会导致可读性降低或代码质量下降,那么它就不再是一个好目标了
  • 可能表现不佳

现在看到实际代码会很有趣,但我怀疑它可能不需要任何边界检查,例如通过使循环从 1 而不是 0 开始。或者,如果这是一个循环模式,您将编写一个辅助函数(或使用现有的 on)进行迭代,并在一次迭代中访问多个元素。这将减少代码量,这实际上是值得的。

关于c++ - 使用 std::out_of_range 逻辑不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45230902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com