Есть ли СУХОЙ способ обработки ошибок в обратных вызовах? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть сетевая библиотека, которая использует asio для асинхронного чтения и записи.Я нахожу себя пишущим, как мне кажется, глупый шаблонный код:

asio::dispatch(m_strand, [&, cb]() {
          m_buffer = write::startup(m_params);
          write(m_buffer, [&, cb](std::error_code ec, std::size_t len) {
            if (ec) {
              sql_state state;
              cb(ec, state);
              return;
            }
            read([&](std::error_code ec, packet barray) {
              if (ec) {
                sql_state state;
                cb(ec, state);
                return;
              }
              auto packets = parse::split_into_packets(barray);
              uint8_t auth_type{1};
              state = fsm::authentication_request(packets.front(), auth_type);
              if (state) {
                cb(ec, std::move(state));
                return;
              }
            });
          });
        });

Есть ли способ элегантно абстрагироваться от обработки ошибок?

...