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

时间:2014-07-26 01:42:08

标签: c++ rcpp armadillo

我编写了一个使用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++

1 个答案:

答案 0 :(得分:2)

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

  • 对例外的引用,
  • 只是错误转发到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。