为什么我不能抓住这个例外?
我的(客户端)代码:
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
类型错误中恢复?
答案 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所述的原因,这些语言不赞成。