相关疑难解决方法(0)

C++中异常对象的范围

C++中异常对象的范围是什么?一旦执行catch处理程序,它是否会超出范围?另外,如果我创建一个未命名的异常对象并抛出它,那么在捕获该异常时,如果我通过const引用或非const引用捕获它是否重要?

c++ scope exception-handling

39
推荐指数
2
解决办法
8340
查看次数

如何知道导致异常的确切代码行?

如果我自己生成异常,我可以在异常中包含任何信息:源文件的许多代码行和名称.像这样的东西:

throw std::exception("myFile.cpp:255");
Run Code Online (Sandbox Code Playgroud)

但是未处理的异常或不是由我生成的异常是什么?

c++ exception

34
推荐指数
5
解决办法
3万
查看次数

为什么C++不使用std :: nested_exception来允许从析构函数中抛出?

从析构函数抛出异常的主要问题是,在析构函数被调用的那一刻,另一个异常可能是"在飞行中"(std::uncaught_exception() == true),因此在这种情况下做什么并不明显.用新的"覆盖"旧的异常将是处理这种情况的可能方法之一.但是决定在这种情况下必须调用std::terminate(或其他std::terminate_handler).

C++ 11通过std::nested_exception类引入了嵌套异常功能.该特征可用于解决上述问题.旧(未捕获)异常可能只是嵌套到新异常中(反之亦然?)然后可能抛出嵌套异常.但是没有使用这个想法.std::terminate在C++ 11和C++ 14中仍然会出现这种情况.

所以问题.是否考虑过嵌套异常的想法?它有什么问题吗?是不是在C++ 17中会改变这种情况?

c++ exception-handling exception nested-exceptions c++11

16
推荐指数
2
解决办法
5113
查看次数

通过引用投掷非常设临时工

通过非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;
}
Run Code Online (Sandbox Code Playgroud)

是否有可能导致e.what包含垃圾,但是e.在哪里保持完整?例如:
e.where是"123"
e.get()返回大量垃圾数据,直到碰巧遇到空字节.

c++ exception undefined-behavior

1
推荐指数
1
解决办法
2843
查看次数