c – 捕获异常:错误:svd()无法收敛

我编写了一个使用Armadillo svd_econ函数的函数.我正在尝试处理svd无法收敛的情况,因为在某些情况下它不会中止该函数.

有问题的错误是:

error: svd_econ(): failed to converge

基于我对SVD documentation的读取,这应该抛出一个std :: runtime_error,并根据我对Exceptions tutorial的读取,我应该能够像这样处理它:

arma::mat U, V;
arma::vec S;
try {
  // aDat and subsetRows are previously defined
  arma::svd_econ(U, S, V, aDat.rows(subsetRows), "right", "dc");
} catch (std::runtime_error e) {
  std::cout << "Exception caught!" << std::endl;
  // I want to abort, and return the error to R:
  throw Rcpp::exception(e.what());
}

但是,当我运行此代码的情况下给出了上面的错误消息时,我得到了一个段错误.如果我删除try-catch块,代码将继续运行,并在代码尝试使用SVD的结果时进一步向下抛出错误.

因为我没有正式学习任何C,所以我认为我只是遗漏了一些明显的东西

最佳答案 看起来不错,我只想尝试一些事情:

>对例外的引用,
>只是错误转发到R,而不是另一个throw(),
>带有Rf_error()的默认块

也许(未经测试)

try {
  arma::svd_econ(U, S, V, aDat.rows(subsetRows), "right", "dc");
} catch (std::runtime_error & e) {
  std::cout << "Exception caught!" << std::endl;
  forward_exception_to_r(e);
} default(...) {
  Rf_error("Unknown exception");
}

但实际上你可以通过Rcpp属性免费获得所有这些,因为这是(自动插入的)END_RCPP宏所做的事情—有关详细信息,请参阅Rcpp书的第2.7节.

编辑但@mtall在他的评论中做了我们应该首先做的事情:检查Armadillo文档.所以你只需检查返回值即可.但您也可以尝试使用建议的try / catch.

点赞