Я видел аргумент, что при связывании с библиотекой C ++, скомпилированной другим компилятором, который используется для компиляции ваших двоичных файлов, исключения могут не работать. Хотя этот нерабочий режим может быть полностью правдивым, на самом деле даже процесс связывания не обязательно должен работать (хотя каждый может придерживаться стандартов), поэтому теоретически этот аргумент является недействительным. На практике, однако, может быть (у меня нет опыта здесь, извините), что конфликты искажения имен возникают редко, конфликты выравнивания редко возникают, и, ну, в общем, все другие специфические для реализации вещи широко согласованы , кроме исключений.
Второй аргумент, который я видел, это производительность во время выполнения. Хотя разматывание стека в случае исключения стоит дорого, я еще не видел справедливого теста, который сравнивал бы исключения с реалистичным количеством проверки кода возврата.
В моем типичном C ++ я использую микс. Я использую более медленные исключения для вещей, которые на самом деле не ожидаем, чтобы происходить часто, или кодовых путей, которые измеряются, чтобы быть выполненными редко, но возвращают коды для вещей, которые с большей вероятностью сломаются и, вероятно, будут вызываться часто.
Бросать исключения в узкий цикл, потому что в каждой итерации выполняется какое-то забавное условие, недешево (при условии, что тело цикла обрабатывает его).