Armadillo库如何处理错误

How does Armadillo library handle error?

本文关键字:处理 错误 何处理 Armadillo      更新时间:2023-10-16

刚开始使用Armadillo库。通过文档和FAQ,我没有找到任何关于Armadillo如何处理错误的参考。例如,我如何知道"mat A(1e10, 1e10)"是否成功?

Armadillo的错误处理机制在其文档中并不清楚。通过与作者Sanderson的邮件沟通,了解到Armadillo的错误处理机制实际上是c++ std异常和C风格返回值的混合。但是,文档中关于将抛出什么异常的信息仍然不完整。

例如,要定义一个矩阵,我建议不要使用"mat X(M, N)",因为没有错误处理。安全的方法是这样的(c风格):

  mat X;
  try{
      X.set_size(M, N);
  } catch (...) {
      printf("memory allocation failedn");
      return -1;
  }

注意,当内存分配错误发生时,将抛出异常"std::logic_error"或"std::bad_alloc"(参见下面mtall的注释),这不会放在文档中。当返回时,使用"X.reset()"释放数据内存。

和@mtall:我建议对特定领域的新手采取不那么苛刻的态度,对社区健康更好。强迫别人阅读不完整的文档并不是建设性的意见。事实上,大多数好的开源项目的文档都不是很好,这就是为什么我们应该帮助它们变得更清晰和用户友好。

Armadillo文档中的示例:

对于R = chol(X)chol(R, X)函数:如果分解失败,R被重置,chol(X)抛出std::runtime_error异常,而chol(R,X)返回bool设置为false

对于eig_sym(X)inv(X)函数:如果X不是正方形,则抛出std::logic_error异常。

对于+等操作符,如果使用不兼容的对象大小,则抛出std::logic_error异常。

对于像A(i,j)这样的元素访问,如果请求的元素越界,则抛出std::logic_error异常。

等等。

Armadillo的源代码也是可用的,因此您可以直接查看它并查看它的功能