无法捕获C++异常

kir*_*rev 1 c++ exception

我想在尝试使用某些类的复制构造函数时捕获异常,这会抛出.

#include <iostream>

class dont_copy_me {
public:
    dont_copy_me() {}
    dont_copy_me(const dont_copy_me& rhs) {throw;}
    dont_copy_me(dont_copy_me&& rhs) {throw;}
    ~dont_copy_me() {}
};

int main() {
    try {
        dont_copy_me obj;
        dont_copy_me obj_1(obj);
    } catch(...) {
        std::cout << "exception caught" << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但我一直在努力

terminate called without an active exception
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

怎么了?如何捕获复制构造函数抛出的异常?(因为那是我需要的)

Bau*_*gen 6

实际上抛出这样的异常:

#include <iostream>
#include <stdexcept>

class dont_copy_me {
public:
    dont_copy_me() {}
    dont_copy_me(const dont_copy_me& rhs) {throw std::runtime_error("Fail!");}
    dont_copy_me(dont_copy_me&& rhs) {throw std::runtime_error("Fail!");}
    ~dont_copy_me() {}
};

int main() {
    try {
        dont_copy_me obj;
        dont_copy_me obj_1(obj);
    } catch(...) {
        std::cout << "exception caught" << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这可以满足您的需求.在这里,您可以找到标准例外列表(在"例外类别"下).

throw只有在处理活动异常时,空表达式才有效:

重新排列当前处理的异常.放弃当前catch块的执行并将控制传递给下一个匹配的异常处理程序(但不会在同一个try块之后传递给另一个catch子句:它的compound-statement被认为已经'退出'),重用现有的异常对象:没有新的对象.此表单仅在当前正在处理异常时允许(如果另外使用则调用std :: terminate).如果在构造函数上使用,则与函数try-block关联的catch子句必须通过rethrowing退出.

这里开始,强调我的.