链接数据库等问题忽略,仅对数据库链接时的部分操作提出疑问。try and catch究竟能捕获到数据库访问错误时的什么信息,如下面程序段所示:
bool CRecords::addARecord ( LPCSTR uName, LPCSTR password )
{
cstrUser = "select id,nickname from userInfo";
lpcstrUser = cstrUser;
try
{
m_pRecordset->Open(lpcstrUser,
m_pConnection.GetInterfacePtr(),  
adOpenDynamic,
adLockOptimistic,
adCmdText);
if ( !m_pRecordset->BOF )
m_pRecordset->MoveLast();
m_pRecordset->AddNew ();
lpcstrUser = uid;
m_pRecordset->PutCollect("id", lpcstrUser);
m_pRecordset->PutCollect("password", password);
m_pRecordset->Update();
m_pRecordset->Close();
}
catch ( _com_error *e )
{
AfxMessageBox(e->ErrorMessage());
m_pRecordset->Close();
return false;
}
return true;
}这是一个很简单的程序,目的是向数据库存入数据。假设数据库中 userInfo 表中没有 id 项,那么该程序就会直接瘫痪掉。可是我使用了try and catch结构,理论上来说应该是com口抛出_com_error对象,然后catch捕获该对象进行异常处理。但是每次运行的结果确是程序执行非法操作,直接瘫痪掉,那么请问try and catch 在这里怎么就不处理异常了呢?还是我的程序编写上本来就存在是try and catch 无效的错误?

解决方案 »

  1.   

    说句实话,在这个问题上,我也是糊里糊涂的。因为,我以前是用 PB 开发的,PB在这些错误处理上都非常的简单。希望高手给与解答!
      

  2.   

    用catch(...)
    因为抛出的异常如果不是_com_error的话你的catch是捕捉不到的。
      

  3.   

    ( _com_error *e )
    好像一般都是用( _com_error &e )这个方法确实有一些异常无法捕获到,所以有本书上提到,自己判断返回值,然后手工抛出异常……
      

  4.   

    谢谢楼上两位,问题解决了。
    果然是用catch(...)或者catch(_com_error &e)更加稳定,现在的异常情况都能捕捉到了。