我正在调用一个来自静态库的函数,它抛出了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(...)
没有抓住它成功。
答案 0 :(得分:2)
它不应该抓住一切吗?
仅在达到处理程序时。在某些情况下,无法捕获异常,而是调用std::terminate
。
[except.throw] / 7如果是异常处理机制,则在完成异常对象的初始化之后 激活异常的处理程序,调用一个通过异常退出的函数std :: terminate 被称为
[except.ctor] / 1当控件从抛出异常的位置传递给处理程序时,析构函数由a调用 本节中指定的进程称为堆栈展开。如果由堆栈直接调用析构函数放松 - 如果出口有异常,则调用std :: terminate(15.5.1)。 [注意:因此,析构函数应该 通常捕获异常,不要让它们从析构函数中传播出来。 - 结束说明]