-5

なぜこの例外をキャッチできないのですか?

私の(クライアント)コード:

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

例外をスローするEigenコードは、数レベル下にあります。

    EIGEN_STRONG_INLINE void resize(インデックス行、インデックス列)
    {{
        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(サイズ)
          m_data = internal :: conditional_aligned_new_auto(size);
        そうしないと
          m_data = 0;
        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
      }
      m_rows=行;
      m_cols = cols;
    }

太字の線は、線の前にヒットする線です。

throw std::bad_alloc();

internal::conditional_aligned_delete_auto(m_data, m_rows*m_cols);ヒットします。これは、関数呼び出し内のどこかで発生します。

クライアントコードからこの例外をキャッチできないのはなぜですか?resizeEigenライブラリが関数をマークしなかったため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

intスローされる実際の例外はタイプですが、タイプの例外をキャッチしています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ブロックは渡されます。

これを修正する 1 つの方法は、一般的な "catch all" ブロックを使用することです。

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

ステートメント内の省略記号は、catch(...)例外の種類を解決する必要がないことを意味します。タイプに関係なく、すべての例外がキャッチされます。

ただし、これは推奨されていないようです。 これは、Java および C# のジェネリック ステートメントに類似している可能性があります。これらの言語では、catch( Exception e )ここに記載されている理由で嫌われています。

于 2012-06-29T16:16:52.153 に答える