13

どちらを使用する必要がありますか?

catch (_com_error e)  

また

catch (_com_error& e)
4

4 に答える 4

28

二番目。ここにサッターを引用する私の試みがあります

「値でスロー、参照でキャッチ」

catch適切に学習する: 例外を値 (ポインターではなく) でスローし、参照 (通常は へconst) でキャッチします。これは、例外セマンティクスと最もよく調和する組み合わせです。同じ例外を再スローするときはthrow;throw e;.

これがItem 73の全文です。値でスローし、参照でキャッチします。


例外を値でキャッチしないようにする理由は、暗黙的に例外のコピーを作成するためです。例外がサブクラスのものである場合、それに関する情報は失われます。

try { throw MyException ("error") } 
catch (Exception e) {
    /* Implies: Exception e (MyException ("error")) */
    /* e is an instance of Exception, but not MyException */
}

参照によるキャッチは、例外をコピーしないことでこの問題を回避します。

try { throw MyException ("error") } 
catch (Exception& e) {
    /* Implies: Exception &e = MyException ("error"); */
    /* e is an instance of MyException */
}
于 2008-09-29T23:09:02.580 に答える
13

個人的に、私は3番目のオプションに行きます:

catch (const _com_error& e)
于 2008-09-30T01:52:32.127 に答える
6

また、MFC を使用する場合は、ポインターでキャッチする必要がある場合があることに注意してください。それ以外の場合は、@JaredPar の答えが通常の方法です (ポインターをスローするものに対処する必要がないことを願っています)。

于 2008-09-29T23:14:42.270 に答える
3

間違いなく2番目。次の場合:

class my_exception : public exception
{
  int my_exception_data;
};

void foo()
{
  throw my_exception;
}

void bar()
{
  try
  {
    foo();
  }
  catch (exception e)
  {
    // e is "sliced off" - you lose the "my_exception-ness" of the exception object
  }
}
于 2008-09-29T23:13:24.973 に答える