我想我會做一些關于捕獲例外的挖掘。
根據這個問題(C 捕獲所有例外),其中一個答案指出:
[
catch(...)] 將捕獲所有 C 例外,但它應該被認為是糟糕的設計。
目前我已經使用了這種方法:
CPTSDatabase::~CPTSDatabase()
{
try
{
CloseDatabase();
}
catch(...)
{
}
}
void CPTSDatabase::CloseDatabase()
{
if (m_dbDatabase.IsOpen())
m_dbDatabase.Close();
}
我認為這是正確的方法,因為當我追蹤CDatabase::Close()它時會做類似的事情:
// Disconnect connection
void CDatabase::Close()
{
ASSERT_VALID(this);
// Close any open recordsets
AfxLockGlobals(CRIT_ODBC);
TRY
{
while (!m_listRecordsets.IsEmpty())
{
CRecordset* pSet = (CRecordset*)m_listRecordsets.GetHead();
pSet->Close(); // will implicitly remove from list
pSet->m_pDatabase = NULL;
}
}
CATCH_ALL(e)
{
AfxUnlockGlobals(CRIT_ODBC);
THROW_LAST();
}
END_CATCH_ALL
AfxUnlockGlobals(CRIT_ODBC);
if (m_hdbc != SQL_NULL_HDBC)
{
RETCODE nRetCode;
AFX_SQL_SYNC(::SQLDisconnect(m_hdbc));
AFX_SQL_SYNC(::SQLFreeConnect(m_hdbc));
m_hdbc = SQL_NULL_HDBC;
_AFX_DB_STATE* pDbState = _afxDbState;
AfxLockGlobals(CRIT_ODBC);
ASSERT(pDbState->m_nAllocatedConnections != 0);
pDbState->m_nAllocatedConnections--;
AfxUnlockGlobals(CRIT_ODBC);
}
}
并且CDatabase::Close檔案甚至沒有說明任何有關拋出例外的資訊。
鏈接的答案確實指出:
你可以使用c 11的新
current_exception機制。
鑒于CDatabase我們正在使用的類,我們是否可以使用這種方法尚不清楚。
uj5u.com熱心網友回復:
既然CDatabase::Close()是THROW_LAST用來 throw CDBException,你就必須用catch (CDBException* e). 即使您不處理它,您仍然必須處理Delete錯誤。當CDatabase直接呼叫方法時,您也可以這樣做:
void CPTSDatabase::CloseDatabase()
{
try
{
if (m_dbDatabase.IsOpen())
m_dbDatabase.Close();
}
catch (CDBException* e)
{
//TRACE(L"DB error: " e->m_strError);
e->Delete();
}
}
或使用
CPTSDatabase::~CPTSDatabase()
{
try { CloseDatabase(); }
catch (CDBException* e) { e->Delete(); }
catch(...) {}
}
因為在這段代碼中并不清楚例外來自哪里。catch(...) {}將處理其他例外。一般catch(...) {}不推薦,因為它沒有提供有用的資訊,它只是說“出了點問題......”
僅當您添加throw自己的代碼或使用std函式時才使用標準庫例外。例子:
try { std::stoi("wrong argument"); }
catch (const std::exception& e) { TRACE("%s\n", e.what()); }
try { throw 123; }
catch (int i) { TRACE("%d\n", i); }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333261.html
上一篇:合并兩列,優先考慮最右邊列的值
下一篇:用Selenium找不到一個按鈕
