どちらを使用する必要がありますか?
catch (_com_error e)
また
catch (_com_error& e)
二番目。ここにサッターを引用する私の試みがあります
「値でスロー、参照でキャッチ」
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 */
}
個人的に、私は3番目のオプションに行きます:
catch (const _com_error& e)
また、MFC を使用する場合は、ポインターでキャッチする必要がある場合があることに注意してください。それ以外の場合は、@JaredPar の答えが通常の方法です (ポインターをスローするものに対処する必要がないことを願っています)。
間違いなく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
}
}