一个负责写数据库的程序崩溃了,检查原因是不能连接上数据库,抛出异常。
调试的时候发现,ADO 数据库的 Open() 操作错误,于是抛出异常 _com_error,然后异常处理开始,输出 log。但是问题出在退出异常处理的时候,居然又发生异常了。
// 示例代码
bool InsertDB()
{
CADODatabase db;
db.Open(); // throw an exception...
}
void SaveToDatabase()
{
try
{
InsertDB();
}
catch (_com_error &e)
{
log (e.Description());
} // another exception is thrown here...
}
|
后来发现,Open() 在抛出异常的时候,传入了 this,怀疑 _com_error 持有了这个数据库对象。而在处理异常的位置,数据库对象已经释放了,所以异常对象在销毁的时候,会错误的引用了数据库对象而发生异常。
// 抛出异常的语句
_com_issue_errorex(_hr, this, __uuidof(this));
|
最后处理的办法是把异常的处理移到数据库对象结束以前:
bool InsertDB()
{
CADODatabase db;
try
{
db.Open();
}
catch (_com_error &e)
{
log(e.Description());
}
}
void SaveToDatabase()
{
InsertDB();
}
|
这种异常对象依赖于另一个对象的生命周期,很麻烦。
阅读(1778) | 评论(0) | 转发(0) |