我已经多次听过和读过,最好将异常作为引用而不是引用来引用.为什么是
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
Run Code Online (Sandbox Code Playgroud)
比...更好
try {
// stuff
} catch (std::exception& e) {
// stuff
}
Run Code Online (Sandbox Code Playgroud) C++中异常对象的范围是什么?一旦执行catch处理程序,它是否会超出范围?另外,如果我创建一个未命名的异常对象并抛出它,那么在捕获该异常时,如果我通过const引用或非const引用捕获它是否重要?
标准是否有关于引用捕获的异常以及尝试修改它的情况有什么说法?
请考虑以下代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个人为的例子,我实际上并没有尝试这样的事情.我只是好奇会发生什么,基于另一个线程中的建议,异常应该被const引用捕获.
我的老板回答了这个问题为什么......挡块中存在......(三分)?相当优雅.
但这让我想到了一些事情(希望能弥补我之前的不好问题),确实如此
catch(...){
throw;
}
Run Code Online (Sandbox Code Playgroud)
通过值(即采用深拷贝)或通过引用重新抛出捕获的异常?
请考虑以下代码:
#include <iostream>
#include <stdexcept>
void foo()
{
throw std::runtime_error("How long do I live?");
}
int main()
{
try
{
foo();
}
catch (std::runtime_error& e)
{
std::cout << e.what() << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我可以通过引用捕获异常,不是std::runtime_error("How long do I live?")rvalue?
为什么异常对象在catch块中仍然存在?
究竟抛出异常对象存储在哪里?他们的一生是几岁?