我应该如何使用C ++构造函数异常?

时间:2013-12-29 16:55:37

标签: c++ exception constructor

我几天前从未尝试过使用C ++异常,而且我不确定我是否正确行事。我试图在失败的构造函数上抛出异常,比如

X::X() {
    /*...*/
    if(error)
        throw;
    /*...*/
}

使用它像:

try {
    X a;
    X b;
    X c;
}
catch (...) {
    // error handling
}

调试器(VS)说抛出时有一个无法解决的异常。抛出后的代码被执行(我虽然像返回一样工作),并且没有执行catch块。我在这里错过了什么? 我可能稍微过分简化了这篇文章,但原始代码在这里发布有点复杂。

2 个答案:

答案 0 :(得分:2)

这是因为你没有抛出异常对象。你应该像这样使用throw:

throw std::runtime_error("Error message");

然后你就能通过

捕获它
try {
    ...
} catch (const std::runtime_error& e) {
    /* Handling */
}

查看stdexcept标题。

答案 1 :(得分:1)

你应该throw some exception(通常是std::exception的某个子类的实例),例如

X::X() {
   /*...*/
   if(error)
       throw std::runtime_error("my bad");
   /*...*/
}

有关详情,请参阅std::runtime_error

没有任何异常的

throw;仅在catch block内有意义。

我同意Danvil's answer:在构造函数中抛出异常是很糟糕的。

相关问题