Ответ 1
Создание исключений является дорогостоящим, поскольку трассировка стека должна быть заполнена. Бросание и отлавливание исключений также дороже обычного возвращения. Учитывая это, вы можете задать себе следующие вопросы:
-
Вы хотите принудительно обработать ошибку вызывающим? Если это так, не бросайте исключение, так как Scala не имеет механизма проверки-исключения, который заставляет вызывающего чтобы поймать их.
-
В случае ошибки вы хотите включить сведения о том, почему это не удалось? Если нет, вы можете просто вернуть
Option[A]
, гдеA
- ваш тип возврата, и тогда у вас будет либоSome(validContent)
, либоNone
, без каких-либо дополнительных объяснений. Если да, вы можете вернуть что-то вродеEither[E, A]
или ScalazValidation[E, A]
. Все эти параметры заставляют вызывающего пользователя каким-то образом развернуть результат, будучи свободным для обработки ошибкиE
по своему усмотрению. Теперь что должноE
быть? -
Вы хотите предоставить трассировку стека в случае сбоя? Если это так, вы можете вернуть
Either[Exception, A]
илиValidation[Exception, A]
. Если вы действительно идете с исключением, вы захотите использоватьTry[A]
, двумя возможными случаями которого являютсяFailure(exc: Throwable)
иSuccess(value: A)
. Обратите внимание, что вы, конечно, возьмете затраты на создание броска. Если нет, вы можете просто вернутьсяEither[String, A]
(и быть особенно осторожным, чтобы помнить, означает лиRight
успех или сбой здесь -Left
обычно используется для ошибок, аRight
для "правильного" значения -Validation
возможно яснее). Если вы хотите по желанию вернуть трассировку стека, вы можете использовать LiftBox[A]
, который может бытьFull(validContents)
,Empty
без дополнительных объяснений (очень похоже наOption[A]
до здесь) или указатьFailure
который может хранить строку ошибки и/или бросать (и многое другое). -
Возможно, вам нужно предоставить несколько указаний относительно того, почему это не удалось? Затем верните
Either[Seq[String], A]
. Если вы часто это делаете, возможно, вам захочется использовать Scalaz иValidation[NonEmptyList[String], A]
вместо этого, что дает некоторые другие приятные лакомства. Посмотрите его для получения дополнительной информации об этом или посмотрите эти примеры использования.