为什么不能抓住我的例外

时间:2017-07-11 13:26:38

标签: c++ c++11 exception exception-handling

我正在调用一个来自静态库的函数,它抛出了nlopt异常,因此我使用以下代码来定位异常。

    try
    {
        reg_info("Before GP");
        omp_set_num_threads(1);
        GP predictor(train_in, train_out);
        predictor.set_noise_lower_bound(1e-3);
        reg_info("Before Train");
        predictor.train();
        reg_info("After Train");
        reg_info("Before Predict");
        predictor.predict(pred_in, pred_y, pred_s2);
        reg_info("After Predict");
        reg_info("After GP");
    }
    catch(...)
    {
        reg_info("Exception");
    }

但是我收到了以下输出消息:

 Info  : Before GP
 Info  : Before Train
terminate called after throwing an instance of 'nlopt::forced_stop'
  what():  nlopt forced stop

似乎predictor.train();抛出了异常,但为什么它没有被catch(...)抓住?不应该抓住一切吗?

它查看了GP::train()的源代码,它确实抛出了一个未正确捕获的nlopt::forced_stop()异常,但仍然,我不明白为什么catch(...)没有抓住它成功。

1 个答案:

答案 0 :(得分:2)

  

它不应该抓住一切吗?

仅在达到处理程序时。在某些情况下,无法捕获异常,而是调用std::terminate

  

[except.throw] / 7如果是异常处理机制,则在完成异常对象的初始化之后   激活异常的处理程序,调用一个通过异常退出的函数std :: terminate   被称为

     

[except.ctor] / 1当控件从抛出异常的位置传递给处理程序时,析构函数由a调用   本节中指定的进程称为堆栈展开。如果由堆栈直接调用析构函数放松 -   如果出口有异常,则调用std :: terminate(15.5.1)。 [注意:因此,析构函数应该   通常捕获异常,不要让它们从析构函数中传播出来。 - 结束说明]