如果通过引用捕获异常,可以修改它并重新抛出吗?
If you catch an exception by reference, can you modify it and rethrow?
标准对通过引用捕获的异常以及试图修改它会发生什么有任何规定吗?
考虑以下代码:
class my_exception: public std::logic_error
{
public:
std::vector<std::string> callstack;
};
void MyFunc()
{
try
{
SomethingThatThrows();
}
catch (my_exception & e)
{
e.callstack.push_back("MyFunc");
throw;
}
}
这是一个人为的例子,我实际上并没有尝试这样做。我只是好奇会发生什么,基于另一个线程的建议,异常应该被const引用捕获。
异常将会改变。
§15.3 (except.handle)/17:
当处理程序声明一个非常量对象时,对该对象的任何更改都不会影响临时对象通过执行throw表达式初始化的对象。
当处理程序声明引用时对于非常量对象,对引用对象的任何更改都是对初始化的临时对象的更改当throw表达式被执行时,如果该对象被重新抛出,它将生效。
因此,如果my_exception
在MyFunc
之外被捕获,我们将在调用堆栈中看到"MyFunc"
条目(例如http://ideone.com/5ytqN)
是的,你可以这样做。
当您使用throw;
重新抛出当前异常时,不会生成副本:原始临时异常对象被重新抛出。因此,在处理程序中对该对象所做的任何更改都将在下次捕获异常对象时呈现在异常对象中。
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 从构造函数抛出异常时如何克服内存泄漏
- GCC对可能有效的代码抛出init list生存期警告
- 如何在文件和行号中抛出错误
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 动态构造函数中的新字符 [] 抛出"损坏的顶部大小";
- .exe应用程序在windows10中创建新模块时抛出错误,但在windows7中工作正常
- 较新版本的GCC抛出reinterpret_cast错误
- 操作员新不会在Android上抛出bad_alloc
- 捕获并修改 std::exception 和子类,重新抛出相同的类型
- 尽管没有定义标题,但新的抛出bad_alloc <new> ?
- 我相信这是clang中的一个错误,它与构造函数抛出的placement新表达式有关
- 如果通过引用捕获异常,可以修改它并重新抛出吗?
- 为什么Java必须抛出并发修改异常?
- 尝试在Visual Studio 2013中创建web服务器对象的新实例时抛出错误
- 新 int[] 抛出'Access Violation'异常