Chinaunix首页 | 论坛 | 博客
  • 博客访问: 578797
  • 博文数量: 79
  • 博客积分: 2513
  • 博客等级: 少校
  • 技术积分: 806
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-04 18:46
文章分类

全部博文(79)

文章存档

2014年(1)

2010年(5)

2009年(8)

2008年(11)

2007年(41)

2006年(13)

我的朋友

分类: C/C++

2007-11-09 09:50:34

一个负责写数据库的程序崩溃了,检查原因是不能连接上数据库,抛出异常。

调试的时候发现,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) |
给主人留下些什么吧!~~