2012-06-28 64 views
-5

为什么我不能捕捉到这个异常?如何捕获Eigen的MatrixXd :: resize()函数抛出的异常?

我(客户端)代码:

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);函数调用的某处。

为什么我无法从我的客户端代码中捕获此异常?是否因为特征库没有用throws标记resize函数?我怎样才能使这个代码使用Eigen库从这个malloc类型错误中顺利恢复?

+10

Erm,因为catch(int)不能捕获std :: bad_alloc吗? –

+0

嗯,我应该注意,我从来没有使用C++异常 – bobobobo

回答

1

问题是由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陈述的原因,在这些语言中皱眉。

+1

catch(...)还会捕获各种通常不会作为std :: exception抛出的异常,如浮点异常,除零,页面错误等。如果你调用你不完全信任的代码(例如,一个插件),并且如果它做了一些令人讨厌的事情时想让整个应用程序崩溃,它会非常有用。 – finalman

8
catch(std::bad_alloc& e) { 
} 

应该帮助

6

您正赶上int类型的异常,而抛出的实际的异常是std::bad_alloc()类型。

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

可能是你想要的。

12

您必须注意正确的异常类型。用途:

catch(std::exception &e) 

代替:

catch(int e)