C ++ - Аргументы для исключений над кодами возврата - PullRequest
29 голосов
/ 04 декабря 2009

У меня дискуссия о том, как идти в новом проекте C ++. Я предпочитаю исключения перед кодами возврата (только для исключительных случаев) по следующим причинам -

  1. Конструкторы не могут дать код возврата
  2. Разъединяет путь отказа (который должен быть очень редким) из более чистого логического кода
  3. Быстрее в неисключительном случае (без проверки, если / иначе сотни тысяч раз)
  4. Если кто-то испортит настройки кода возврата (забудет вернуть FAIL), может потребоваться очень много времени для поиска.
  5. Лучшая информация из сообщения, содержащегося в ошибке. (Мне было указано, что возвращаемое перечисление может сделать то же самое для кодов ошибок)
  6. От Джареда Пар Невозможно игнорировать без кода, специально разработанного для его обработки

Это пункты, которые я придумал, подумав об этом, и из поисков в Google. Я должен признать, что был предрасположен к исключениям, работавшим в C # в течение последних нескольких лет. Пожалуйста, опишите дальнейшие причины использования исключений по кодам возврата. Для тех, кто предпочитает коды возврата, я также хотел бы выслушать ваши рассуждения. Спасибо

Ответы [ 11 ]

0 голосов
/ 05 декабря 2009
  1. Конструкторы не могут дать код возврата (за исключением случаев, когда вы, возможно, генерируете исключения в конструкторе, в котором вы находитесь, для мира вреда)

  2. Разъединяет путь отказа (который должен быть очень редким) из более чистого логического кода (Открывает гораздо более широкий путь отказов. Исключения C ++ совсем не похожи на C #. Мне нравятся исключения C #. Исключения C ++ хуже, чем бесполезны. Отчасти из-за реализации, отчасти из-за того, чем является и не является c ++)

  3. Быстрее в неисключительном случае (без проверки, если / иначе сотни тысяч раз) (Не совсем. Вы должны проверять одинаковое количество ошибок независимо от того, что, вы просто не видите, где они проверяются. Кроме того, есть ошибки, которые имеют значение, и те, которые не имеют значения или, по крайней мере, имеют значение для вашего кода, поэтому Вам не нужно проверять каждую вещь (проверяете ли вы, что new сгенерировал ошибку?))
  4. Если кто-то испортит настройки кода возврата (забудет вернуть FAIL), его отслеживание может занять очень много времени. (Я возьму миллион таких ошибок за любую из распространенных ошибок, возникающих с исключениями C ++)
  5. Лучшая информация из сообщения, содержащегося в ошибке. (Мне было указано, что возвращаемое перечисление может сделать то же самое для кодов ошибок) (Хорошо, как вы реализуете обработку ошибок? Это зависит от вас, не так ли? У вас могут быть исключения, которые не дают полезной информации или коды ошибок, которые регистрируют обширные данные при сбое. В C ++ они, кажется, никогда не дают полезной информации в тех случаях, когда вы действительно этого хотите)
  6. От Джареда Парла невозможно игнорировать без кода до специально разработанного для него решения (Конечно, но этот код, как правило, бесполезный код. Это похоже на принятие закона, в котором говорится, что у всех должны быть программы без ошибок. Люди, которые так или иначе не подчиняются таким законам, и для людей, которые делают это, они уже обрабатывают ошибки там, где они должен в любом случае)

Что касается причин против:

  1. Желая, чтобы ваша программа действительно работала хотя бы некоторое время.
  2. производительности.
  3. ИДЕОЛОГИЯ. Если это ошибка, мы не должны ее восстанавливать. Мы либо умираем с сообщением об ошибке, регистрируем и продолжаем, либо полностью игнорируем его. Если бы мы могли это исправить, это была бы не ошибка, а особенность ... и если вы используете такой код намеренно, никакие инструменты отладки в мире не спасут вас.

В основном один.

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