繁体   English   中英

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

[英]How should I use C++ constructor exceptions?

直到几天前,我才从未尝试过使用C ++异常,而且我不确定自己是否做对了。 我试图在失败的构造函数上引发异常,例如

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

并像这样使用它:

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

调试器(VS)表示有未处理的异常。 抛出后的代码被执行(尽管抛出虽然像返回一样工作),但catch块未执行。 我在这里想念什么? 我可能将这篇文章简化了一些,但是原始代码在这里发布有点复杂。

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

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

那么您就可以通过

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

看看stdexcept标头。

您应该throw一些异常 (通常是std :: exception的某些子类的实例),例如

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

有关更多信息,请参见std :: runtime_error

throw; 没有任何例外只是在catch块内有意义。

我同意Danvil的回答 :在构造函数中引发异常的味道很差。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM