如何捕获Eigen的MatrixXd :: resize()函数引发的异常?

时间:2012-06-28 14:34:55

标签: c++ exception-handling eigen

为什么我不能抓住这个例外?

我的(客户端)代码:

Eigen::MatrixXd FFs ;
try
{
  FFs.resize( NUMPATCHES, NUMPATCHES ) ;
}
catch( int e )
{
  error( "Not enough memory :(" ) ;
  return ;
}

抛出异常的特征代码是向下几级......

    EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
    {
        internal::check_rows_cols_for_overflow(rows, cols);
        m_storage.resize(rows*cols, rows, cols);
    }

哪个电话

    void resize(DenseIndex size, DenseIndex rows, DenseIndex cols)
    {
      if(size != m_rows*m_cols)
      {
        internal::conditional_aligned_delete_auto(m_data, m_rows*m_cols);
        if (size)
          m_data = internal::conditional_aligned_new_auto(size);
        else
          m_data = 0;
        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
      }
      m_rows = rows;
      m_cols = cols;
    }

粗体线是在线之前被击中的线:

throw std::bad_alloc();

被点击,它发生在internal::conditional_aligned_delete_auto(m_data, m_rows*m_cols);函数调用中的某个地方。

为什么我无法从客户端代码中捕获此异常?是因为Eigen库没有用resize标记throws函数吗?如何使用Eigen库使此代码顺利从malloc类型错误中恢复?

4 个答案:

答案 0 :(得分:12)

您必须捕获正确的异常类型。使用:

catch( std::exception &e )

而不是:

catch( int e )

答案 1 :(得分:8)

catch( std::bad_alloc& e) {
}

应该帮助

答案 2 :(得分:6)

您正在捕获类型int的异常,而抛出的实际异常属于std::bad_alloc()类型。

catch (std::bad_alloc& e)
{
    exit(1); // or some other appropriate behavior
}

可能就是你想要的。

答案 3 :(得分:2)

问题是resize()抛出的异常是std::exception。但是,问题中的代码明确尝试捕获类型int的异常。这不起作用,catch块将被传递。

解决这个问题的一种方法是使用一般的“全部捕获”块:

try
{
  FFs.resize( NUMPATCHES, NUMPATCHES ) ;
}
catch(...) // catch all exceptions, no type declaration required
{
  error( "Not enough memory :(" ) ;
  return ;
}

catch(...)语句中的省略号表示您不必解析异常类型。无论何种类型,都将捕获所有异常。

然而,这似乎不推荐。 This may be analogous to the generic catch( Exception e ) statements in Java and C#,由于here所述的原因,这些语言不赞成。