В последнее время мы столкнулись с проблемой переноса нашей платформы С++ на платформу ARM, на которой запущен uClinux, где единственным поддерживающим поставщиков компилятором является GCC 2.95.3. Проблема, с которой мы столкнулись, заключается в том, что исключения крайне ненадежны, что заставляет все не зацепиться за не связанную нить (!). Это, кажется, документированная ошибка, т.е. здесь и здесь.
После некоторого обсуждения мы решили исключить исключения, поскольку мы достигли точки, где исключения наносят большой ущерб работающим приложениям. Теперь основная проблема заключается в том, как управлять случаями, когда конструктор не удался.
Мы опробовали ленивую оценку, где каждый метод имеет возможность создавать динамические ресурсы и возвращать значение состояния, но это означает, что каждый метод класса должен возвращать возвращаемое значение, которое делает лот ifs в коде и очень раздражает в методах, которые обычно никогда не будут вызывать ошибки.
Мы рассмотрели добавление статического метода create, который возвращает указатель на созданный объект или NULL, если создание завершилось неудачно, но это означает, что мы больше не можем хранить объекты в стеке, и по-прежнему необходимо передать ссылку на значение статуса если вы хотите действовать на фактическую ошибку.
В соответствии с Руководством по стилю Google С++ они не используют исключения и выполняют только тривиальную работу в своих конструкторах, используя метод init для нетривиальных work (Выполнение работы в конструкторах). Однако я не могу найти ничего о том, как они обрабатывают ошибки построения при использовании этого подхода.
Кто-нибудь здесь пытался исключить исключения и придумал хорошее решение для обработки отказа строительства?