Вариант против исключения в обработке исключений - PullRequest
10 голосов
/ 31 октября 2011

После некоторого использования типа F # option я понимаю, что его можно использовать для обработки исключительных случаев. Я могу использовать option или Exception в следующих примерах:

  1. Функции find из модулей List / Array / Seq повышают KeyNotFoundException в редких случаях, в то время как соответствующие аналоги tryFind возвращают None в этих ситуациях.
  2. Когда я выполняю возврат (при решении N-ферзей, Судоку и т. Д.), Когда у ветви нет решения, я могу либо вызвать исключение и перехватить его позже, либо вернуть None, чтобы сопоставить это значение с возвратом. Эти случаи происходят довольно часто, пока мы не найдем решение.

У меня сложилось впечатление, что option - более функциональный подход, в то время как Exception более широко используется в платформе .NET.

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

Ответы [ 4 ]

15 голосов
/ 31 октября 2011

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

Поскольку это свойство CLR, на самом деле не имеет значения, находитесь ли вы в F # или нет. Я понимаю, что другие среды выполнения для ML-подобных языков, например, ocaml, не имеют этой характеристики, и поэтому могут чаще использовать исключения для потока управления.

8 голосов
/ 01 ноября 2011

Мой вопрос: в чем различия между Option и Exception при обработке исключений с точки зрения удобства использования, производительности ...?

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

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

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

5 голосов
/ 31 октября 2011

С теоретической точки зрения. option - это то, что вы должны использовать в тех функциях, которые являются чисто с точки зрения FP (вы можете узнать, что такое чистые функции). Исключения больше касаются нечистого мира (Как и мир ввода-вывода в Хаскеле).

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

По сравнению с производительностью, выдача исключений POV обходится дороже (из-за разматывания стека - поиск соответствующего обработчика исключений и т. Д.) По сравнению с возвращаемыми типами опций.

4 голосов
/ 01 ноября 2011

С точки зрения удобства использования я предпочитаю варианты в F #.

  • Опции инкапсулируют исключительное состояние, а также ожидаемое состояние.Это позволяет вам обрабатывать обработку исключительного состояния до тех пор, пока вам не понадобится ожидаемое состояние.
  • Опция также имеет ряд вспомогательных функций , которые вам придется написать самостоятельно.за исключением
  • Частичные активные шаблоны позволяют очень аккуратно обрабатывать несколько исключительных случаев с помощью параметров.
  • Необязательные параметры в F # реализованы с помощью параметров.Эта отложенная природа, о которой я упоминал выше, позволяет вам не заботиться о том, что породило исключительный случай, при условии, что потребитель имеет для него значение по умолчанию.

Параметры - это принципиально иной способ представления об исключительных случаях иЯ считаю, помогите сделать F # особенным.

...