Подтвердить что ты не робот

"Мы не используем исключения С++" - Какая альтернатива? Пусть это рухнет?

Мы не используем исключения С++.

Если вы не используете исключения, что происходит, когда есть ошибка? Вы просто позволили программе сбой?

4b9b3361

Ответ 1

Или вы могли бы прочитать немного дальше:

С их стороны преимущества использования исключения перевешивают издержки, особенно в новых проектах. Однако, для существующего кода, введение исключения имеют последствия для всех зависимый код. Если исключения могут быть распространялся за рамки нового проекта, он также становится проблематичным для интеграции новый проект в существующий исключающий код. Потому что большинство существующий код на С++ в Google не подготовленный к устранению исключений, он сравнительно трудно принять новый код, который генерирует исключения.

Учитывая, что существующий код Google а не исключения, использование исключений несколько больше чем затраты в новом проекте. Процесс конверсии будет медленным и подвержены ошибкам. Мы не считаем, что доступные альтернативы исключения, такие как коды ошибок и утверждений, бремя.

Наш совет против использования исключений не основывается на философских или моральные основания, но практические. Потому что мы хотели бы использовать наши проекты с открытым исходным кодом в Google и это трудно сделать, если эти проекты используют исключения, нам нужно рекомендовать исключение из Google проекты с открытым исходным кодом. вещи вероятно, были бы разными, если бы мы делать все сначала с нуля.

Существует исключение из этого правила (нет каламбур) для кода Windows.

Ответ 2

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

Ответ 3

Если вы не используете исключения по определению, никакой код не будет генерировать исключение, поэтому он не понадобится быть пойманным.

Это "Мы не используем исключения С++", а не "Мы не ловим исключения С++".

Ответ 4

Связанный стиль руководства объясняет это хорошо:

С их стороны преимущества использования исключения перевешивают издержки, особенно в новых проектах. Однако, для существующего кода, введение исключения имеют последствия для всех зависимый код. Если исключения могут быть распространялся за рамки нового проекта, он также становится проблематичным для интеграции новый проект в существующий исключающий код. Потому что большинство существующий код на С++ в Google не подготовленный к устранению исключений, он сравнительно трудно принять новый код, который генерирует исключения.

В С++ относительно легко создавать надежный код без использования исключений или беспокоиться об исключительных гарантиях. С кодами возврата и утверждениями исключения действительно ограничены ошибками программиста.

Ответ 5

Альтернативы исключениям, кроме кодов возврата:

  • LISP -строчный условный обработчик.
  • Программные сигналы и слоты, QT-стиль.
  • Аппаратное прерывание или обработчик сигналов без стека. Это раскладывание стека, что является проблемой с исключениями на встроенных устройствах.
  • longjmp/setjmp
  • Функция обратного вызова
  • Значение флага, например. errno (Unix), GetLastError (Windows), glGetError (OpenGL) и т.д.
  • Очередь сообщений, если программа управляется событиями
  • Переменный функтор. Объект обработчика как параметр ввода-вывода, указатель изменяется при ошибке.
  • Волокна или потоки с совместным подходом с разрешением ошибки
  • asm __int 3 или эквивалент процессора
  • Инструкции наложения или функции батута.

... и многое другое. Многие из перечисленных выше встроены в устройство.

Ответ 6

Если вы пишете код и достигаете точки, в которой вы определили проблему, для которой вы обычно генерируете исключение, но хотите соблюдать некоторые условия, что исключения не будут использоваться, тогда вам нужно найти другое способ сообщить код клиента об ошибке.

Как и многие существующие ответы, вы можете вернуть значение контрольной суммы (например, значение 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". Это позволяет лучше кодировать внутренне, но лучше взаимодействовать снаружи. К сожалению, иногда использование исключений нецелесообразно, так как ваш код будет выполняться в среде, где механизмы обработки исключений не предусмотрены... возможно, внутри ядра, драйвера или встроенной среды с усеченным компилятором на языке С++. Такая среда не соответствует действительности С++, поскольку она не соответствует стандарту.

Ответ 7

Вы используете версии функций, возвращающих код ошибки, и действуете в соответствии с возвращаемым значением.