考虑这些代码是在现实生活中发生的。
库代码具有一个名为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的一种好习惯吗?在这种情况下,要求库代码不要抛出,如果用户指定了将抛出的函数回调,那么错误处理就成为问题了吗?
答案 0 :(得分:1)
如果必须这样做,我会将实际工作移到一个辅助函数中:
bool log_on_impl() { /* real work here*/ }
bool log_on() {
bool success = log_on_impl();
callback(success);
return success;
}
通过这种方式,log_on_impl
可以尽早恢复其内心的满足感;仍然会使用正确的值调用回调。