Мы не используем исключения С++.
Если вы не используете исключения, что происходит, когда есть ошибка? Вы просто позволили программе сбой?
Мы не используем исключения С++.
Если вы не используете исключения, что происходит, когда есть ошибка? Вы просто позволили программе сбой?
Или вы могли бы прочитать немного дальше:
С их стороны преимущества использования исключения перевешивают издержки, особенно в новых проектах. Однако, для существующего кода, введение исключения имеют последствия для всех зависимый код. Если исключения могут быть распространялся за рамки нового проекта, он также становится проблематичным для интеграции новый проект в существующий исключающий код. Потому что большинство существующий код на С++ в Google не подготовленный к устранению исключений, он сравнительно трудно принять новый код, который генерирует исключения.
Учитывая, что существующий код Google а не исключения, использование исключений несколько больше чем затраты в новом проекте. Процесс конверсии будет медленным и подвержены ошибкам. Мы не считаем, что доступные альтернативы исключения, такие как коды ошибок и утверждений, бремя.
Наш совет против использования исключений не основывается на философских или моральные основания, но практические. Потому что мы хотели бы использовать наши проекты с открытым исходным кодом в Google и это трудно сделать, если эти проекты используют исключения, нам нужно рекомендовать исключение из Google проекты с открытым исходным кодом. вещи вероятно, были бы разными, если бы мы делать все сначала с нуля.
Существует исключение из этого правила (нет каламбур) для кода Windows.
Нет, альтернативой является то, что люди делали на протяжении веков в C... вы возвращаете код состояния ошибки, который указывает, была ли эта функция успешной или нет, и в зависимости от того, как она может потерпеть неудачу, вы можете иметь один или несколько параметров, в которых вы указываете, как это произошло (или вы включаете тип сбоя в код состояния ошибки, опять же это дело в каждом случае).
Если вы не используете исключения по определению, никакой код не будет генерировать исключение, поэтому он не понадобится быть пойманным.
Это "Мы не используем исключения С++", а не "Мы не ловим исключения С++".
Связанный стиль руководства объясняет это хорошо:
С их стороны преимущества использования исключения перевешивают издержки, особенно в новых проектах. Однако, для существующего кода, введение исключения имеют последствия для всех зависимый код. Если исключения могут быть распространялся за рамки нового проекта, он также становится проблематичным для интеграции новый проект в существующий исключающий код. Потому что большинство существующий код на С++ в Google не подготовленный к устранению исключений, он сравнительно трудно принять новый код, который генерирует исключения.
В С++ относительно легко создавать надежный код без использования исключений или беспокоиться об исключительных гарантиях. С кодами возврата и утверждениями исключения действительно ограничены ошибками программиста.
Альтернативы исключениям, кроме кодов возврата:
... и многое другое. Многие из перечисленных выше встроены в устройство.
Если вы пишете код и достигаете точки, в которой вы определили проблему, для которой вы обычно генерируете исключение, но хотите соблюдать некоторые условия, что исключения не будут использоваться, тогда вам нужно найти другое способ сообщить код клиента об ошибке.
Как и многие существующие ответы, вы можете вернуть значение контрольной суммы (например, значение true/false success, enum). Эта практика широко известна из общих функций C, заданных POSIX и libc, таких как fopen(), strstr() или printf().
Еще один важный параметр - установить некоторое внутреннее состояние, которое они могут запросить позже. Почему вы можете или хотите сделать последнее? Поскольку некоторые функции, имеющие решающее значение конструкторы и операторы С++, обычно не дают вам возможности вернуть код ошибки. Например, в:
X x1(something), x2(whatever); fn(x1 + x2);
X::X(...)
ничего не может вернуть. X::operator+
может быть вызван (предполагается, что +
не вызывается по результатам операторов преобразования), но fn()
предположительно ожидает const X&
(или X&&
с С++ 11) и operator+
потребности для возврата X
, чтобы он работал в успешной ситуации. У вас нет шансов вернуть отчетный код ошибки. class X
может потребоваться установить некоторое внутреннее состояние, чтобы другой код (возможно, fn()
, возможно, оператор после fn()
) тестировал, чтобы предпринять соответствующие действия.
Итак, вы получите что-то вроде:
X x1(something), x2(whatever);
assert(x1.is_valid() and x2.is_valid());
X x3 = x1 + x2;
assert(x3.is_valid());
fn(x3);
Обратите внимание, что это соглашение об обработке ошибок является многословным и подвержено упущению или игнорированию клиентскими кодами - одно из причин исключения было создано. Интересная вариация на этом используется большинством аппаратных средств с плавающей точкой - некоторые операции, такие как деление на 0 или под/переполнение, могут устанавливать регистр в значения дозора, такие как "Нет" "NaN" или +/- Infinity, а затем операции, связанные с аргументом в таком состоянии распространяют состояние на результат. Например, x = 8 + y / 0; z = x + 2;
также установит z
часовому. Идея здесь заключается в том, что вы можете написать код, который по возможности вычисляет правильный результат, и проверять один раз перед использованием результата, чтобы увидеть, что ошибка в любом месте кода вычисления недействительна. Иногда он работает нормально для математического кода, особенно если вы не принимаете решения ветвления на основе текущих значений переменных, но, к сожалению, во многих ситуациях вы либо не сможете, либо не захотите сделать всех пользователей потенциально недействительный объектный код с супер-защитой для обработки и распространения состояний ошибок.
Использование С++ без исключений серьезно ставит под угрозу удобство использования, удобство обслуживания, краткость и элегантность языка.
Как альтернатива полному запрету на использование исключений, в некоторых средах вы можете поймать все исключения на границах вашего API, а затем вернуть коды ошибок или значения дозорного в стиле "C". Это позволяет лучше кодировать внутренне, но лучше взаимодействовать снаружи. К сожалению, иногда использование исключений нецелесообразно, так как ваш код будет выполняться в среде, где механизмы обработки исключений не предусмотрены... возможно, внутри ядра, драйвера или встроенной среды с усеченным компилятором на языке С++. Такая среда не соответствует действительности С++, поскольку она не соответствует стандарту.
Вы используете версии функций, возвращающих код ошибки, и действуете в соответствии с возвращаемым значением.