C ++:ScopeGuard与返回检查和异常处理?

时间:2019-06-22 01:05:14

标签: c++ error-handling

考虑这些代码是在现实生活中发生的。

库代码具有一个名为log_on()的函数,失败时返回false,成功时返回true,但是错误情况过多。

在返回true / false之前,它需要调用指定的回调函数应用程序。看起来像这样:

bool log_on() {
    // do something else
    bool success = false;
    scope_guard guard = [&success]() {
        if (success) {
            callback(success);
        } else {
            callback(false);
        }
    }
    success = prepare_logon();
    if (success) {
         int rc = send_password();
         if (rc == PASSWORD_ERR) {
             return false;
         }
    }
    if (!send_some_data()) return false;
    success = true;
    return true;
}

目的是返回案例太多,如果返回true和false,则需要调用一些回调。因此,有人使用Scopeguard来执行此操作。这是将退货支票替换为Scopeguard的一种好习惯吗?在这种情况下,要求库代码不要抛出,如果用户指定了将抛出的函数回调,那么错误处理就成为问题了吗?

1 个答案:

答案 0 :(得分:1)

如果必须这样做,我会将实际工作移到一个辅助函数中:

bool log_on_impl() { /* real work here*/ }

bool log_on() {
  bool success = log_on_impl();
  callback(success);
  return success;
}

通过这种方式,log_on_impl可以尽早恢复其内心的满足感;仍然会使用正确的值调用回调。