Почему исключения так редко используются в C ++ - PullRequest
6 голосов
/ 25 марта 2011

Я программирую на C ++ в течение 5 лет, почему я никогда не видел исключений, используемых для примера, кроме примеров?

Ответы [ 11 ]

15 голосов
/ 25 марта 2011

Наблюдательный уклон на работе здесь.

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

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

Это не значит, что не существует кода C ++, использующего исключения - есть, и его много. Он может просто не появиться в коде, предназначенном для решения проблем, которые интересуют you .

10 голосов
/ 25 марта 2011

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

Iлично я считаю, что они незаменимы при обработке сбоев конструктора (это главная причина, по которой они все-таки были добавлены в C ++), но они также требуют правильного использования других расширенных (YMMV) методов, таких как RAII или интеллектуальные указатели, чтобы избежать утечек ресурсов.*

7 голосов
/ 26 марта 2011

Я программирую на C ++ около 5 лет, почему я никогда не видел, чтобы исключения использовались для примера, кроме примеров?

Мне очень любопытно,Мне очень интересно об этом с 1996 года. Иногда я думаю, что в 1996 году обработка исключений в C ++ произвела революцию в том, как я пишу программное обеспечение.Я помню, что я читал об обработке исключений в C ++ и сразу понял последствия.Через несколько минут я проверял, что происходит, если из конструктора выдается исключение.Я думаю, что компиляторы для UNIX не были готовы к обработке исключений C ++ до G ++ 3.0 (где это было?).Деструкторы были вызваны для не сконструированных областей памяти (в стеке) (в случае какого-то исключения было выброшено).Деструкторы не были вызваны для успешно построенных объектов (в стеке) (в случае какого-то исключения было выброшено).delete не вызывалось в случае, если объект, созданный с new, бросил исключение из конструктора.Компиляторы для Windows и OS / 2 были готовы в 1996/1997.Они работали.Я помню Borland C ++ для OS / 2 и IBM CSet2 и Windows Visual C ++.

Наконец-то появился способ прервать построение объекта.Наконец, можно выделить объект внутри конструктора И положиться на успешное построение этого объекта в каком-то другом конструкторе.Как-то я узнал обо всех правилах.Не из книг!Спустя годы вышли книги, утверждающие, что обработка исключений в C ++ - это хороший способ отловить ошибки массива или другие проблемы, для которых я никогда не переставал использовать assert.Наконец, появился простой способ предоставить вызывающей стороне сложную информацию о некоторой ошибке, не полагаясь на stderr.Наконец, не нужно было отлаживать какую-то сложную часть программного обеспечения, чтобы выяснить, в чем дело.

Я не могу воспринимать людей всерьез, которые не используют C ++ Exception Handling.Невозможно проверить каждый ошибочный звонок.Невозможно достичь того же уровня качества программного обеспечения без использования C ++ Exception Handling.Почему таких людей все еще нанимают?Почему все еще существуют платформы, которые не предоставляют C ++ Exception Handling.Я бы никогда не подумал о написании программного обеспечения для такой платформы, так же, как я отказался бы от написания сложного приложения в ассемблерном коде.

6 голосов
/ 25 марта 2011

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

4 голосов
/ 25 марта 2011

На ум приходит несколько причин:

  1. Исключения не должны быть очень заметны, так как они предназначены для того, чтобы бросать их глубоко в недра библиотеки и захватывать где-то высоко в стеке вызовов (даже до main()).
  2. Они предназначены для сигнализации исключительных (то есть редких и неожиданных) неисправностей. Например, неспособность открыть файл не особенно исключительна. Поэтому по умолчанию библиотека iostream не выдает исключение, когда не удается открыть файл.
  3. Исключения очень дорогие, что способствует соблюдению замысла проекта.
  4. Библиотеки C ++, которые генерируют исключения, не легко взаимодействуют с программами на Си.
1 голос
/ 19 января 2014

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

1 голос
/ 25 марта 2011

Поскольку существует огромное несоответствие между кодом «реального мира» и кодом «учебника».

Я работаю в «большой» программной компании и могу честно сказать вам, что материал, который вы видите вПроизводство следует почти за 0% хороших практик, о которых вы читаете в хороших книгах.

Возьмите книгу Скотта Мейерса «Эффективный C ++» в качестве примера.Должна быть копия на столе каждого разработчика программного обеспечения, от восточного побережья до запада.

1 голос
/ 25 марта 2011

Я мог бы сказать то же самое, и это было бы не слишком предвзято, если бы я определил, что это верно для мира Microsoft и RAD.

Я думаю, что это потому, что сегодня вы не используете C ++программы как таковые, а скорее смесь языка высокого уровня с использованием библиотек C ++.И часто у вас есть управляемая-неуправляемая граница.

Бросать и ловить исключение через эту границу - все равно что зажигать фейерверк в заднице :) - [читай утечка памяти или еще хуже]

Более того, если выДля использования COM-объектов необходимо использовать исключения COM, поэтому использование стандартного исключения C ++ должно находиться внутри зачастую небольшой библиотеки.В небольших библиотеках вам не нужно использовать исключения.

0 голосов
/ 29 декабря 2013

Исключения не используются в примерах, потому что они редко находятся в центре внимания многих вопросов или того, что вы хотите знать в первую очередь.

0 голосов
/ 05 июня 2013

Я говорю о настольных приложениях для Windows.По моим наблюдениям (YMMV тоже), более ранняя фаза разработки, вероятно, до первоначальных выпусков.Многие разработчики не думают об исключениях на ранней стадии.Вот почему существует немного кодов с обработкой исключений, но если у вас уже есть 2 или 3 релиза или если вы находитесь на этапе обслуживания, исключения рассматриваются из-за различных сред развертывания в сообщениях об ошибках от клиентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...