Как именно вы можете использовать стандартную библиотеку C++ без исключений? I использовать некоторые векторы в моей библиотеке. Как узнать, действительно ли функция push_back была выполнена? Есть ли какой-либо стандартный способ узнать, произошло ли событие , или это просто выход (1) или что-то еще?
Вы отважитесь на очень ограничительную территорию после отключения обработки исключений на C++.
Некоторые стандартные реализации библиотек, такие как Dinkumware, позволяют отключать исключения. Там вопрос определения макроса _HAS_EXCEPTIONS, как 0. STLPort имеет аналогичное соглашение с _STLP_USE_EXCEPTIONS = 0.
Однако стандартного определения стандартных библиотек не существует, если исключения отключены. Обработка исключений, по большей части, в значительной степени укоренилась на языке C++. Даже dynamic_cast
и operator new/new[]
бросать по умолчанию, и это не функции библиотеки.
Существует также отсутствие четкого определения того, что должно произойти даже для стандартных реализаций библиотек, которые не выбрасываются. Если последовательность push_back
бросает в процессе выделения большего количества памяти для этой последовательности, что должно произойти? Элемент просто не вставлен? Стандартные интерфейсы этих последовательностей, конечно, ничего не говорят о том, когда возникает такая ошибка.
Кроме того, многие библиотеки C++ в целом будут использовать функции, которые выполняют как оператор new (а не нечерные версии). В результате мы делаем много неопределенной территории поведения, когда мы отключим исключения.
Мне некогда приходилось работать в компании, которая запрещает обработку исключений, поскольку старшие программисты были преждевременными оптимизаторами, которые предпочли C и считали, что C++ был ужасен и неэффективен (по совпадению они написали некоторые из самых неэффективных кодов на команда с сильным предпочтением для связанных списков в качестве контейнера по умолчанию, из-за которого профилирующие горячие точки отображались слева и справа из-за того, что огромное количество мелких узлов было выделено/освобождено для всего, но это уже другая история).
С встроенными системами аргумент против обработки исключений может быть немного сильнее, но без него сложно полагаться на C++. Я думаю, что лучшее, что вы можете сделать без обработки исключений, - это принять искалеченную форму C++ без большого количества стандартных частей библиотеки, которые бросают, если вы не хотите вкладывать много времени, пытаясь найти обходные решения и трюки, характерные для вашего конкретного поставщика стандартной библиотеки что может быть больше проблем, чем того стоит.
возможно дублирование http://stackoverflow.com/questions/3870435/handling-stl-errors-without-exceptions – Philipp