Try-catch不带参数,使用引用
try-catch without argument, use reference?
正如前面许多答案中提到的,应该按值抛出异常,并通过引用([A], [B])捕获异常,例如
try {
// throw std::exception();
}
catch(std::exception &e) {
// handle exception
}
如果你不打算使用异常本身(即使你应该),这将在编译时产生令人讨厌的"未使用的变量"警告。为了避免这些,您可以省略参数(上面示例中的e
),此时catch
块将触发定义的异常,但是您不需要为变量操心。
try {
// throw std::exception();
}
catch(std::exception) {
// handle exception
}
甚至我们的主和救主也以这种方式发布了一个答案(就像其他人一样)。不过,我确实发现了一个使用引用的实例。
由于没有使用变量,所以切片不是问题,因此按值捕获和按引用捕获之间应该没有有效的区别。然而,为什么人们似乎要区分有变量和无变量的情况呢?省去了添加&号的麻烦?
而且,微优化,因为它可能(特别是考虑到异常异常应该如何),按值的情况不产生铸造成本(看看catch
是否适合抛出的异常)减轻时,通过引用?
由于没有使用变量,所以切片不是问题。
但是在切片的情况下,你会强制复制。这并不是特别有问题,因为异常应该位于很少使用的代码路径上。
但是,如果在复制/切片之后将异常作为嵌套异常重新抛出,那么最终结果可能会令人惊讶。例如:struct E : std::runtime_error { using std::runtime_error::runtime_error; };
throw E("");
...
catch(std::runtime_error)
{
std::throw_with_nested(std::logic_error(""));
}
... further down the call stack...
catch(std::exception& e)
{
// what did we actually catch? std::runtime error nested in a std::logic_error, or
// E nested in a std::logic_error?
}
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 具有常量引用参数的函数模板专用化
- C++:常量引用参数
- 字符串引用参数的效率C++
- 通过非常量引用参数修改常量引用参数
- 如何将指针变量作为引用参数传递?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 移动类的成员作为常量引用参数传递
- C++带有适用于左值和右值的引用参数的函数
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 委托构造函数和引用参数
- 对 const 引用参数使用默认值会导致崩溃
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 将非左值作为常量引用参数传递.临时是在本地作用域还是在调用方作用域中创建的?
- 如何强制函数仅接受左值引用参数
- 模板引用参数推断失败C++
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 将unique_ptr作为引用参数或常量传递unique_ptr引用