【问题标题】:Use of uncaught_exception to handle error conditions使用 uncaught_exception 处理错误情况
【发布时间】:2011-12-07 16:02:04
【问题描述】:

我有以下问题。

我有被回收的数据库连接(放回池中)。

例如:

{
 session sql(conn_str); // take connection from pool

 sql.exec("insert into ...")
} // at the end of the scope return connection to pool

但在某些情况下,回收可能是错误的 - 例如断开连接或其他一些重大错误。

所以我想自动防止连接被回收。我想要 使用std::uncaught_exception 实现以下技术 - 所以 exec() 函数 将检测异常并防止回收:

session::exec(...)
{
   guard g(this)

   real_exec(...);
}

在哪里看守:

class guard {
public:
   guard(session *self) : self_(self) {}
   ~guard() {
      if(std::uncaught_exception()) {
        self->mark_as_connection_that_should_not_go_to_pool();
      }
   }
}

现在,我知道 http://www.gotw.ca/gotw/047.htm 不建议使用 std::uncaught_exception 在另一种情况下,我也没有看到我的代码有任何问题, 提供了讨论的示例。

这段代码是否有任何可能的问题。

注意:

  1. 我希望此更改是非侵入性的,以便 SQL 后端能够抛出而不检查每个案例是否是关键的。
  2. 我不希望用户对此采取任何行动,因此对他来说是透明的。

【问题讨论】:

    标签: c++ exception-handling uncaught-exception


    【解决方案1】:

    我认为您的方法与更简单的方法相比没有任何优势:

    session::exec()
    {
        try
        {
            real_exec();
        }
        catch(...)
        {
            mark_as_connection_that_should_not_go_to_pool();
            throw;
        }
    }
    

    如果这个解决方案的冗长困扰你,我会注意到他们还没有从 C++ 中删除宏。我不喜欢这个版本,因为它掩盖了底层代码并且有点丑。

    #define GUARD try {
    #define ENDGUARD } catch(...) { mark_as_connection_that_should_not_go_to_pool(); throw; }
    
    session::exec()
    {
        GUARD
        real_exec();
        ENDGUARD
    }
    

    另一种可能性是在成功之前假设失败。

    session::exec()
    {
        mark_as_connection_that_should_not_go_to_pool();
        real_exec();
        mark_as_connection_that_may_go_to_pool();
    }
    

    最后要回答uncaught_exception 是否会像你所说的那样工作的问题,我将引用微软的函数文档:

    特别是,uncaught_exception 在从异常展开期间调用的析构函数调用时将返回 true

    它似乎完全符合您的预期。

    【讨论】:

    • 我不使用这种方法的原因是因为它更冗长。因此,如果您有两打功能做同样的事情,那么“守卫”是解决此类问题恕我直言的更简单明了的方法。
    • 另外std::uncaught_exception()是标准函数,可能不像try/catch那么常用
    • 在这种特殊情况下,是否存在任何使用std::uncaught_exception() 的特殊情况?
    • @Artyom,我不知道,但正如你所说,这是一个很少使用的功能。我在回答中添加了支持性声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多