重新抛出const异常引用
re throwing const exception reference
在一道选择题中,有人问我下面的程序在做什么:
catch(const std::exception& e){
throw e;
}
我回答它是rethrow e(答案C),但答案显然是错误的。
它在做什么?扔一个e的副本(答案D)?
其他可能的答案是:A)处理异常B)捕获e
中的当前堆栈跟踪谢谢
throw
语句复制其参数。这意味着throw e;
将e
切片到它的基类(或者无论e
的静态类型是什么)。要重新抛出原始异常,请使用throw;
.
抛出一个e
的副本。答案D正确。
重新抛出do:
catch(const std::exception& e) {
throw;
}
它正在做正如锡上所说的:你正在重新扔e
。从概念上讲,获取e
的值拷贝,尽管编译器可以优化掉任何深度拷贝,如果这样做没有副作用的话。
要保证不复制,只需写入throw;
。
相关文章:
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常
- 为什么标准不允许通过引用捕获不完整的异常类型?
- std::unique_ptr 在 try-catch 块中未捕获取消引用异常
- 为什么要抛出引用调用复制构造函数的异常?
- C++ 未定义对 vtable 异常的引用
- 动态指针引用数组由三元运算符返回值,但有异常
- 通过引用派生类对象从基类对象执行向下转换时引发bad_cast异常
- 通过引用从 c++ 函数异常返回对象是否安全
- 修改引用的 int 时引发的特权指令异常
- 自定义 std::shared_ptr 或 boost::shared_ptr 以在 NULL 取消引用时引发异常
- STL中使用引用计数的数据结构存在哪些行为异常
- 如何通过引用捕获异常来解决局部变量问题
- 对`vtable for XXX的未定义引用(其中XXX是结构异常)
- 通过引用捕获异常时未创建临时对象
- 空引用如何导致代码0xc0000005的 SEH 异常
- 引发对局部变量具有常量引用的异常
- C++异常处理通过引用传递:抛出的地址与捕获的地址不同
- 为什么 std::shared_ptr 取消引用不会引发空指针异常(或类似异常)?
- 通过引用捕获异常是否危险
- 通过引用捕获(使用 catch)时异常对象的范围