-5

为什么我不能捕捉到这个异常?

我的(客户)代码:

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

引发异常的特征代码低了几级..

    EIGEN_STRONG_INLINE void resize(索引行,索引列)
    {
        内部::check_rows_cols_for_overflow(rows, cols);
        m_storage.resize(rows*cols, rows, cols);
    }

哪个电话

    void resize(DenseIndex size, DenseIndex rows, DenseIndex cols)
    {
      如果(大小!= m_rows*m_cols)
      {
        内部::conditional_aligned_delete_auto(m_data, m_rows*m_cols);
        如果(大小)
          m_data = internal::conditional_aligned_new_auto(size);
        别的
          m_data = 0;
        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
      }
      m_rows = 行;
      m_cols = 列;
    }

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

throw std::bad_alloc();

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

为什么我不能从我的客户端代码中捕捉到这个异常?是因为 Eigen 库没有用 标记resize函数throws吗?如何使用 Eigen 库使此代码malloc顺利地从此类错误中恢复?

4

4 回答 4

12

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

catch( std::exception &e )

代替:

catch( int e )
于 2012-06-28T14:38:56.543 回答
8
catch( std::bad_alloc& e) {
}

应该有帮助

于 2012-06-28T14:37:13.167 回答
6

您正在捕获 type 的异常int,而实际抛出的异常是 type std::bad_alloc()

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

可能是你想要的。

于 2012-06-28T14:38:27.270 回答
2

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

解决此问题的一种方法是使用通用的“catch all”块:

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

语句中的省略号catch(...)意味着您不必解析异常类型。无论类型如何,都会捕获所有异常。

但是,这似乎不推荐。 这可能类似于catch( Exception e )Java 和 C# 中的通用语句,由于此处所述的原因,它们在这些语言中不受欢迎。

于 2012-06-29T16:16:52.153 回答