关于C ++ vector :: push_back()异常。省略号有用吗?

时间:2014-12-22 20:20:12

标签: c++ try-catch

我经常写这样的代码:

try
{
    vec.push_back(0);
}
catch(const std::bad_alloc &)
{
    ec=1;
}
catch(...)
{
    ec=2;
}

省略号捕获有用吗?你能提供一些链接,我可以找到关于cin,vector,ifstream等引发的异常我需要知道的一切吗?所有C ++的东西...... 类似于 Open Group Base Specifications Issue 7 http://pubs.opengroup.org/onlinepubs/9699919799/),您可以在其中找到函数名称,参数,返回值,标志,错误代码等。

2 个答案:

答案 0 :(得分:2)

如果省略号捕获确实有用,可以说是恕我直言。您应该至少捕获std::exception以匹配更广泛的案例

try {
    vec.push_back(0);
}
catch(const std::bad_alloc &) {
    ec=1;
}
catch(const std::exception &) {
    ec=2;
    // You can inspect what() for a particular reason, or even try to dynamic_cast<>
    // to find out which specific exception was thrown.
}
catch(...) {
    // You have no more type info here, this should be done for last resort (in the
    // outermost scope) only.
    ec=3;
}

我留下了关于优缺点的评论

答案 1 :(得分:2)

我没有看到任何可以抛出异常的限制,但脚注192包含此声明:

  

...库实现应该通过抛出标准异常类的异常或派生出来来报告错误(18.6.2.1,18.8,19.2)。

这是17.6.5.12 [res.on.exception.handling]第4段的脚注,其中也包含这句话:

  

...除非另有说明,否则C ++标准库中定义的没有异常规范的任何其他函数都可能抛出实现定义的异常。

看来,任何体面的实现都只会抛出[{1}} [间接]派生的异常。也就是说,我会抓住std::exception并可能以某种形式报告此异常所提供的std::exception const&字符串(例如,将其记录到合适的目的地)。