Logger.log('старт скрипта') - это что, каждую функцию так начинать и заканчивать?Logger.log('Нормально все прошло идем дальше') - это ты в каждом удобном месте писать хочешь?Logger.log прямо так брать и списывать не стоит, он тоже полезный и им тоже важно пользоваться. Но не для трассировки. reinterpret_cast. Это выстрел себе в ногу.reinterpret_castработает очень коварно:Unlike static_cast, but like const_cast, the reinterpret_cast expression does not compile to any CPU instructions... It is purely a compile-time directive which instructs the compiler to treat expression as if it had the type new_type.
static_cast - этого тут достаточно для работы. Этот каст приведет this к правильному указателю на объект родительского типа. Насколько это правильно?
SocketOutputStream не собирает твои данные в единый бинарный буфер, а сразу пишет их в сокет. Это дает волю кому угодно вклиниться из другого потока в этот сокет между операциями записи в твоем текущем потоке. Т.е. транзакция записи сообщения может быть легко нарушена.flush при этом - это барьер синхронизации между исполнением твоего кода и очисткой конвейера операций устройства (в самом устройстве). В случае блокируемых сокетов flush - фиктивная штука.SocketOutputStream. Т.е. передавай на запись в сокет не сообщение, а буфер, куда сообщение сериализовано.std::vector<int>{10}: вектор с одним элементом или с десятью?
Суть применения конверта в том, чтобы содержать что-то внутри, но давать прозрачный и понятный набор данных для идентификации того, что внутри. Для конверта с исключением на конверте может быть написано имя типа исключения, модуль, где исключение возникло, общий код ошибки. Т.е. все что нужно для ответа на вопрос: тебе этот конверт адресуется или не тебе.
Если тебе, то ты уже открываешь его содержимое и получаешь исключение.