C++中异常对象的范围是什么?一旦执行catch处理程序,它是否会超出范围?另外,如果我创建一个未命名的异常对象并抛出它,那么在捕获该异常时,如果我通过const引用或非const引用捕获它是否重要?
如果我自己生成异常,我可以在异常中包含任何信息:源文件的许多代码行和名称.像这样的东西:
throw std::exception("myFile.cpp:255");
但是未处理的异常或不是由我生成的异常是什么?
从析构函数抛出异常的主要问题是,在析构函数被调用的那一刻,另一个异常可能是"在飞行中"(std::uncaught_exception() == true),因此在这种情况下做什么并不明显.用新的"覆盖"旧的异常将是处理这种情况的可能方法之一.但是决定在这种情况下必须调用std::terminate(或其他std::terminate_handler).
C++ 11通过std::nested_exception类引入了嵌套异常功能.该特征可用于解决上述问题.旧(未捕获)异常可能只是嵌套到新异常中(反之亦然?)然后可能抛出嵌套异常.但是没有使用这个想法.std::terminate在C++ 11和C++ 14中仍然会出现这种情况.
所以问题.是否考虑过嵌套异常的想法?它有什么问题吗?是不是在C++ 17中会改变这种情况?
通过非const引用在try-block中抛出构造在堆栈上的对象,捕获并修改它,然后引用另一个catch块抛出它有什么问题吗?
以下是我所指的内容的简短示例.
struct EC {
    EC(string msg) { what = msg; }
    string where;
    string what;
    void app(string& t) { where += t; }
    string get() { return what; }
};
try {
    try {
        try {
            EC error("Test");
            throw error;
        }
        catch (EC& e) {
            e.app("1");
            throw e;
        }
    }
    catch (EC& e) {
        e.app("2");
        throw e;
    }
}
catch (EC& e) {
     e.app("3");
     cout << e.where << endl;
     cout << e.get() << endl;
}
是否有可能导致e.what包含垃圾,但是e.在哪里保持完整?例如:
 
e.where是"123"
 
e.get()返回大量垃圾数据,直到碰巧遇到空字节.