3

参照によって例外をキャッチすることが、例外オブジェクトのコピーが作成されないようにすることだけが得られる利点です。基本的にの違い

try
{
    CString a_csSQL = _T("SELECT * FROM Library");
    CDatabase aDB;
    aDB.OpenEx(g_csConnectionStringWdDSN,CDatabase::noOdbcDialog));
    aDB.ExecuteSQL(a_csSQL);
}
catch(CDBException *& ex)
{
    ex->Delete();
}

try
{
    CString a_csSQL = _T("SELECT * FROM Library");
    CDatabase aDB;
    aDB.OpenEx(g_csConnectionStringWdDSN,CDatabase::noOdbcDialog))
    aDB.ExecuteSQL(a_csSQL);
}
catch(CDBException * ex)
{
    ex->Delete();
}
4

2 に答える 2

7

投稿した2つのコードの違いは、最初のコードは参照によって例外へのポインターをキャッチし、2番目のコードは値によって例外へのポインターをキャッチすることです。ポインタを扱っているので、どちらの場合も例外はコピーされません。

一般に、例外は値によってスローされ、参照によってキャッチされる必要があります。C ++標準ライブラリは、この期待を念頭に置いて設計されています。ただし、古いライブラリ(たとえば、MFC)は、ここで行うようにポインタによって例外をスローし、ポインタによってキャッチされることが期待されます。

値によるポインターのキャッチと参照によるポインターのキャッチの間に効果的な違いはありませんが、例外を削除し、同じポインターで新しい例外を割り当て、同じ例外を再スローする(完全に役に立たない)オプションを提供する参照によってキャッチする場合を除きます-ポインタ。

于 2013-02-01T20:56:46.583 に答える
0

例外がポインタによってスローされた場合は、参照の使用を避けることができます。

例外が値によってスローされる場合は、参照が本当に必要です。

于 2013-02-01T20:57:25.117 に答える