描述:
先贴一段代码:
inline void TESTHR(HRESULT _hr) { if FAILED(_hr) _com_issue_error(_hr); }
STDMETHODIMP CPnsDBEntry::CreateSqlTable(LPCTSTR szSql, IDispatch **ppConn)
{
// TODO: Add your implementation code here
HRESULT hr = E_FAIL;
_RecordsetPtr pSqlTable = NULL;
try
{
TESTHR(pSqlTable.CreateInstance(__uuidof(Recordset)));
hr = pSqlTable->Open(szSql,
_variant_t((IDispatch *)m_pConnection,true),
adOpenDynamic,
adLockOptimistic,
adCmdText);
if(ppConn)
{
pSqlTable.AddRef();
*ppConn = pSqlTable;
}
}
catch(_com_error e)
{
//保存到错误日志
SLog.LogExEx("In STDMETHODIMP CreateSqlTable,come error:%s,szSql:%s",e.ErrorMessage(),szSql);
hr = E_FAIL;
}
catch(...)
{
//保存到错误日志
SLog.LogExEx("In STDMETHODIMP CreateSqlTable,unknown error,szSql:%s",szSql);
hr = E_FAIL;
}
return hr;
}
就从我的观点来讲,catch(_com_error e)应该能截获所有的错误!但是偏偏有时出现了catch(...)截获出来的错误!由于这个函数很多模块都会用到。而我又无法知道这是个什么错误,偏偏这类错误又不是必现的,导致无法定位一些模块的错误。这是我的心中刺,眼中钉。目前在网上没有找到对我有帮助的讲述。急切希望大侠们不吝赐教,万分地感谢!
注:这里所用数据库是access(2003)的,访问数据库的方式是ADO
解决方案1:
智能指针不释放也是可以的。
pSqlTable.AddRef();
*ppConn = pSqlTable;
最好改为QueryInterface,但这不是引起catch(...)的原因。
没碰到过。 解决方案2:
pSqlTable忘记Release了?
解决方案3:catch(_com_error e)应该是只捕获使用COM代码抛出的异常
解决方案4:出现了其他异常,只能靠...来捕获
解决方案5:有些异常是系统异常,必须靠catch(...)来捕获