C ++: ScopeGuard против проверки возврата и обработки исключений? - PullRequest
0 голосов
/ 22 июня 2019

Считайте, что этот код происходит в реальной жизни.

В коде библиотеки есть функция с именем 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 Ответ

1 голос
/ 22 июня 2019

Если бы мне пришлось это сделать, я бы переместил реальную работу в вспомогательную функцию:

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

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

Таким образом, log_on_impl может сделать ранний возврат к содержанию своего сердца; обратный вызов все равно будет вызываться с правильным значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...