关于捕获异常的良好实践
About catching exception good practices
本文关键字:捕获异常 更新时间:2023-10-16
我正在用c++ 11写一个小程序,这是我第一次真正使用异常。
我有一个关于如何有效捕获异常的问题,经过一些谷歌搜索,我仍然没有答案。
问题如下:通过(const?)左值引用捕获异常,还是通过(const?)右值引用捕获异常,哪种方法更有效(或推荐)?
在代码中:
1)
try { throw std::exception{"what"}; }
catch (std::exception& ex) {}
2)
try { throw std::exception{"what"}; }
catch (const std::exception& ex) {}
3)
try { throw std::exception{"what"}; }
catch (std::exception&& ex) {}
4)
try { throw std::exception{"what"}; }
catch (const std::exception&& ex) {}
您应该通过const左值引用(2)捕获:
try { throw std::exception{"what"}; }
catch (const std::exception& ex) {}
原理:
在c++ 11中,有可能(通过使用shared_future
)两个线程可以同时展开同一个异常。即使您没有意识到使用了shared_future
,也可能在代码中发生这种情况,除非您控制了整个应用程序。
如果两个线程被捕获同时展开同一个异常,并且其中一个或两个线程修改了异常,那么您就得到了一个竞争条件。
所以只要你不需要修改catch子句中的异常对象,让编译器为你强制执行该策略- catch by const&
。如果您确实需要修改异常,那么创建它的副本,修改副本并抛出副本。您可以通过按值捕获来做到这一点,如果您确信这不会切片您的异常对象(如果您捕获std::exception
,通常不是这种情况)。
我认为应该用左值引用的通常方式捕获异常。下面是对
相关文章:
- 当类定义不可见时捕获异常
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 如何通过 pybind11 从 python 中的C++中捕获异常?
- 信号后未捕获异常
- 捕获异常后如何退出程序执行
- C++ 捕获异常后进行清理的标准方法是什么?
- 使用模板类引发和捕获异常
- E/libc++abi:终止于类型为google::protobuf::FatalException的未捕获异常
- 如果在生成 std::thread 后引发,则未捕获异常
- C++ 未捕获异常,程序将终止并中止
- C++程序在第一次尝试时会给出垃圾,但如果它捕获异常并重试,则会给出适当的值
- 仅捕获异常就可以检测所有二进制文件在C 中读取错误是否足够
- 如何捕获 I/O 异常(确切地说是 I/O,而不是 std::exception)
- 为什么捕获异常播放允许尾括号
- throw() 函数应该总是在异常时展开堆栈并允许捕获异常还是必须调用 std::terminate ?
- 寻求与类型为 std::invalid_argument 的未捕获异常相关的运行时错误的建议: stoi:无转换
- 如何从调用函数中捕获异常
- 当用户在字符数组中输入整数值时捕获异常
- C++按值捕获异常时的示例是不好的
- 使用 -O2 或 -O3 标志编译时未捕获异常