Некоторые языки программирования, такие как, например, Scala, имеют концепцию Option
типов (также называемых Maybe
), которые могут либо содержать значение, либо нет.
Из того, что я читал о них, они считаются широко лучшим способом решения этой проблемы null
, потому что они явно вынуждают программиста рассматривать случаи, когда не может быть значения, а не просто взорваться во время выполнения.
Проверенные исключения в Java, с другой стороны, кажутся плохой идеей, и Java кажется единственным широко используемым языком, который их реализует. Но идея, стоящая за ними, кажется, чем-то похожа на Option
тип, чтобы явно заставить программиста иметь дело с тем фактом, что может быть выдано исключение.
Есть ли дополнительные проблемы с проверенными исключениями, Option
которых нет у типов? Или эти идеи не так похожи, как я думаю, и есть веские причины для принудительной явной обработки опций, а не исключений?
источник
Either e a
Тип данных.Ответы:
Потому что
Option
скомпонованы. Есть много полезных методов наOption
которые позволяют вам писать код кратким, в то же время позволяя точный контроль потока:map
,flatMap
,toList
,flatten
и многое другое. Это связано с тем, чтоOption
это особый вид монады, некоторые объекты, которые мы очень хорошо знаем, как составлять. Если бы у вас не было этих методов, и вам приходилось постоянно выполнять сопоставление с образцомOption
илиisDefined
часто вызывать их, они были бы не такими полезными.Вместо этого, хотя проверенные исключения действительно добавляют некоторую безопасность, вы не можете ничего с ними сделать, кроме как перехватывать их или позволять им пузыриться в стеке (с добавленным шаблоном в объявлении типа).
источник
try {/* bunch of complex code involving calls to 50 different methods that may throw SomeCheckedException */} catch(SomeCheckedException e) {/* operation failed, do something */}
иfromMaybe someDefaultValue (something >>= otherThing >>= ...50 other functions that may return Nothing...)
что именно? Кроме того, что первый дает вам больше деталей о том, что пошло не так.Несмотря на то, что исключения и объекты Maybe не связаны с однотипными проблемами.
Исключения
Исключения действительно блестят, когда вам приходится иметь дело с исключительной ситуацией (которая в некоторых случаях является ошибкой). Например, вы анализируете CSV и хотите защитить себя от строк с неправильным форматированием. Местом, где вы обнаружите, что что-то не так, могут быть вызовы некоторых функций вдали от итерации строки. Если вы выбросите исключение на самом глубоком уровне (где вы узнаете о проблеме форматирования), вы можете перехватить его в цикле, записать ошибку и перейти к следующей строке. Вам не нужно ничего менять в остальной части кода.
Проверенное исключение добавляет много боли, потому что все промежуточные функции должны объявлять тип throwable. Эта функция побеждает первоначальные цели, поэтому они не популярны в наши дни.
Возможно объекты
Возможно, объекты следует выбирать, когда вы можете локально справиться с «провалом». В этом смысле они являются заменой кода возврата + передача по ссылочному API или обнуляемому типу.
Преимущество объекта Maybe заключается в том, что вы явно заявляете, что что-то может быть не так. В haskell не имеющий значения объект должен иметь значение, иначе программа не будет компилироваться.
Проблема с обнуляемыми типами состоит в том, что вы должны все время проверять на нулевое значение, чтобы быть абсолютно безопасным. Состояние "что-то может быть не так" является состоянием по умолчанию.
Проблема с кодами возврата + передача по ref apis заключается в том, что они менее читабельны для большинства людей.
источник
потому что
Maybe
вы можете отложить обработку ошибки до тех пор, пока вам действительно не понадобится значение (которое может быть вызвано несколькими вызовами методов)в то время как проверенное исключение должно быть обработано в месте вызова
Единственным преимуществом исключений является то, что может быть передано больше информации о том, почему это не удалось (если кто-то не разработал
MaybeError
с бросаемым полем, когда это ошибка)источник
Maybe
типы с обработкой ошибок. Исключение используется для сообщения об ошибке, тип параметра используется для представления результата частичной функции. Частичное возвращение функцииNothing
не является ошибкой.