try and catch 中对数据库的错误检查问题
链接数据库等问题忽略,仅对数据库链接时的部分操作提出疑问。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 无效的错误?
[解决办法]
用catch(...)
因为抛出的异常如果不是_com_error的话你的catch是捕捉不到的。
[解决办法]
( _com_error *e )
好像一般都是用( _com_error &e )
这个方法确实有一些异常无法捕获到,所以有本书上提到,自己判断返回值,然后手工抛出异常……