是按值抛出和按引用捕获的经验法则

Is throw by value and catch by reference the law of thumb?

本文关键字:经验法则 引用      更新时间:2023-10-16

我感到非常困惑和厌倦C++:正如我所教导的那样,"通过引用或指针传递"克服了在函数中传递参数的副本。

因此,在根据经验法则的异常处理场景中:按值抛出,按引用捕获。

为什么斯特劳斯特鲁普在他的"C++之旅"中按价值捕获? 例如:

void test()
{
    try {
        std::vector v(−27);
    }
    catch (std::length_error) {
        // handle negative size
    }
    catch (std::bad_alloc) {
        // handle memory exhaustion
    }
} 

这个例子是从书中复制的。第59页。(不变量(。

为什么斯特劳斯特鲁普在他的"C++之旅"中抓住了价值?

除非您出于某种原因想要复制异常(例如存储自定义异常类型(,否则您应该始终通过 const& 捕获。这可能是 Bjarne 的疏忽,或者在那个特定的片段中,是否复制异常并不重要。

相关:

  • "始终通过引用捕获异常">

  • C++ catch 块 - 按值或引用捕获异常?


为什么C++变化不一致?我的意思是一切都会不时变化。例如:在C++ 11 中:

这里没有不一致 - static_assert只是变得更加灵活,因为它不再强制用户提供错误消息。这对于布尔条件本身不言自明且错误消息不会添加任何有用内容的情况很有用。