Тот факт, что вы должны признать исключения, является правильным, но это также может быть реализовано с использованием структур ошибок.
Вы можете создать базовый класс ошибок, который проверяет в своем dtor, был ли вызван определенный метод (например, IsOk). Если нет, вы можете что-то записать в журнал, а затем выйти, либо сгенерировать исключение, либо вызвать assert, и т.д ...
Простой вызов IsOk для объекта ошибки без реагирования на него будет эквивалентен записи catch (...) {}
Оба утверждения показали бы одинаковое отсутствие доброй воли программиста.
Передача кода ошибки до правильного уровня вызывает большую озабоченность. По сути, вам придется заставить почти все методы возвращать код ошибки по единственной причине распространения.
Но опять же, функция или метод всегда должны быть аннотированы исключениями, которые они могут генерировать. Таким образом, в основном у вас та же проблема, без интерфейса для ее поддержки.