Используйте исключения для исключительных условий ошибки. У вас есть несколько веских аргументов, и я хотел бы привести некоторые аргументы против.
Во-первых, стандартная библиотека C ++ сама использует исключения повсеместно. Вы не можете использовать контейнерные классы или iostreams без их присутствия. Поскольку многие полезные функции будут использовать их, попытка обойтись без них создаст много проблем.
Во-вторых, нетрудно написать код, безопасный для исключений, когда вы узнали, как это сделать. Это требует последовательного RAII, но так вы должны писать. Вы должны принять подход с конструкцией-фиксацией, но это часто является преимуществом и позволяет избежать некоторых тонких ошибок. (Например, проблема самопредставления полностью исчезает при подходе подкачки копий.) По моему опыту, безопасный код исключений выглядит лучше в целом. Это то, чему программисты C ++ должны научиться, но есть много вещей, которым должны научиться программисты C ++, и это не намного больше.
В-третьих, при условии, что вы ограничиваете исключения исключительными случаями, должно быть минимальное влияние на производительность . И, как отметил Павел Минаев, если вам придется возвращать коды ошибок с результатами, есть вероятность влияния на производительность, поскольку C ++ не настроен для простого возврата нескольких значений.
В-четвертых, действительно трудно сделать старый код безопасным от исключений. Однако это новый проект.
Итак, я не вижу веских причин, чтобы не создавать исключения в исключительных обстоятельствах, и множества причин для этого.