Какая модель обработки ошибок более устойчива?

Необходимо назвать фиксацию. Оператор использования ничего не будет фиксировать для Вас.

8
задан Joel Coehoorn 18 April 2012 в 18:48
поделиться

6 ответов

Я рекомендую использовать оба.

Почему?

«Используйте правильный инструмент для работы»

«Проблема» с кодами возврата заключается в том, что люди часто забывают обращаться с ними . Однако исключения не решают эту проблему! Люди по-прежнему не обрабатывают исключения (они не понимают, что необходимо обработать определенное исключение, они предполагают, что кто-то в стеке обработает его, или они используют catch () и устраняют все ошибки).

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

Хотя код возврата легко определить при написании кода, часто невозможно (или просто утомительно много времени) определить, какие исключения могут быть вызваны вызываемым вами методом. Обычно это приводит к очень плохой обработке исключений.

Исключения должны использоваться для "ошибок". В этом и заключается трудность. Если файл не найден при попытке открыть его, это «ошибка» или «ожидаемая ситуация»? Только звонящий знает. Повсеместное использование исключений по существу превращает каждую часть информации о состоянии в ошибку.

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

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

Пример из .net:

Int32. Parse генерирует исключения (даже если ни одно из его исключений не является ошибкой - вызывающая сторона должна проверить результаты и решить для себя, действителен ли результат). И это просто боль (и снижение производительности) - заключать каждый вызов в try / catch. А если вы забудете использовать команду try / catch, простое пустое поле ввода текста может привести к сбою вашей программы.

Таким образом, родилась Int32.TryParse (). Это делает то же самое, но возвращает код ошибки вместо исключения, так что вы можете просто игнорировать ошибки (принимая значение по умолчанию 0 для любых недопустимых вводов). Во многих реальных жизненных ситуациях это намного чище, быстрее, проще и безопаснее в использовании, чем Int32.Parse ().

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

1
ответ дан 5 December 2019 в 09:26
поделиться

Я решил использовать исключения исключения вместо использования кодов ошибок / возврата. Я совсем недавно очень внимательно изучил это.

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

Для получения дополнительной информации ознакомьтесь с главой «Исключения» в Рекомендации по разработке инфраструктуры: соглашения, идиомы и шаблоны для многоразовых библиотек .NET, второе издание Аддисона-Уэсли.

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

7
ответ дан 5 December 2019 в 09:26
поделиться

Исключения следует использовать, когда что-то исключительное произошло.

например, вам передается нулевой (ничего) объект, когда вы его ожидаете.

Дядя Боб рекомендует исключения вместо кодов ошибок в своей книге Чистый код .

Он говорит

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

3
ответ дан 5 December 2019 в 09:26
поделиться

Предпочитайте №2. Для получения дополнительной информации см. Этот отрывок по выбрасыванию исключений из разработки превосходных рекомендаций по проектированию фреймворка Microsoft от Microsoft, как упоминал Деннис. Обратите особое внимание на раздел «Исключения и производительность».

Краткая версия:

Не возвращать коды ошибок.

Сообщать об ошибках выполнения путем выдачи исключений.

Не использовать исключения для нормального потока управления.

Я настоятельно рекомендую прочитать книгу для полноценного обсуждения, дополненного комментариями ряда знаменитостей Microsoft.

3
ответ дан 5 December 2019 в 09:26
поделиться

Самая большая проблема, с которой я столкнулся с первым, заключается в том, что он пассивен, легко игнорируется и не очень стандартизирован. Как программист узнает, что нужно проверить это свойство? Или какие свойства / методы могут установить ошибку? Или доступ к какому свойству / методу привел к установке ошибки?

Например. В вашем первом примере кода, если o.Error имеет значение True, неясно, вызывала ли инициализация объекта или вызов SomeMethod установку флага.

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

2
ответ дан 5 December 2019 в 09:26
поделиться

Обе они являются приемлемыми формами обработки ошибок, однако предпочтительным выбором для языков .NET является использование исключений.

Есть несколько проблем с использованием кодов возврата (числовых или логическое значение), два из них:

  • Программисты легко упускают из виду / игнорируют
  • Не могут использоваться во всех ситуациях. Что произойдет, если ваш конструктор выйдет из строя? Вы не можете явно вернуть значение из конструктора.

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

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

В языках .NET используются исключения.

Существует несколько проблем с использованием кодов возврата (числовых или логических), две из которых самые большие:

  • Программисты легко упускают из виду / игнорируют.
  • Не могут использоваться в все ситуации. Что произойдет, если ваш конструктор выйдет из строя? Вы не можете явно вернуть значение из конструктора.

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

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

В языках .NET используются исключения.

Существует несколько проблем с использованием кодов возврата (числовых или логических), две из которых самые большие:

  • Программисты легко упускают из виду / игнорируют.
  • Не могут использоваться в все ситуации. Что произойдет, если ваш конструктор выйдет из строя? Вы не можете явно вернуть значение из конструктора.

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

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

t использоваться во всех ситуациях. Что произойдет, если ваш конструктор выйдет из строя? Вы не можете явно вернуть значение из конструктора.

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

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

t использоваться во всех ситуациях. Что произойдет, если ваш конструктор выйдет из строя? Вы не можете явно вернуть значение из конструктора.

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

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

2
ответ дан 5 December 2019 в 09:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: