Подтвердить что ты не робот

В Scala существует ли уже существующая библиотечная функция для преобразования исключений в Options?

Это в основном для переноса java factory методов, которые генерируют исключения, если элемент не может быть создан на основе входов. Я ищу что-то в базовой библиотеке, например:

 def exceptionToOption[A](f: => A):Option[A] ={
    try{
      Some(f)}
    catch{
      case e:Exception => None}
  }

Использование:

val id:Option[UUID] = exceptionToOption(UUID.fromString("this will produce None"))

Я знаю, что могу написать свой собственный, но я хочу проверить, что я не изобретаю колесо.

4b9b3361

Ответ 1

Используйте scala.util.control.Exception:

import scala.util.control.Exception._

allCatch opt f

И вы можете сделать его более изощренным. Например, чтобы уловить только арифметические исключения и получить исключение:

scala> catching(classOf[ArithmeticException]) either (2 / 0)
res5: Either[Throwable,Int] = Left(java.lang.ArithmeticException: / by zero)

Ответ 2

Да, вы можете взглянуть на объект scala.util.control.Exception. Особенно, функция allCatch.

Ответ 3

Как и в случае с scala 2.10, вы можете запустить свой код (например, метод factory) в scala.util.Try, а затем преобразовать его с помощью toOption:

import scala.util.Try
Try("foo".toInt).toOption  // None
Try("7".toInt).toOption    // Some(7)

Или переведен в исходный пример:

val id: Option[UUID] = Try(UUID.fromString("this will produce None")).toOption

Ответ 4

Scalaz предоставляет Validation [+ E, + A], который похож на Either.

val result: Validation[Throwable, Something] = ...

result match {
  case Success(x) => ...
  case Failure(x) => ...
}

Ответ 5

Я использую шаблон, основанный на сигнальных и не сигнальных NaN в современных компьютерах. NaN означает не число. Деление на ноль (fp) создает NaN. sNaNs генерируют исключения, не сигнализирующие NaN просто предоставляются в результате, любое будущее вычисление результата также генерирует NaN. Оценка является сигналом, TryEvaluate не сигнализирует.

Здесь Ctx = Context [I, R] является блоком контекста, который содержит функцию input [I], result [R] и исключение. Все варианты. Метод обновления в контексте является копией-обновлением. Не мутирующее обновление. Супер-черта просто оценивает одну или несколько функций, передавая обновленный контекст следующей функции. Основная функция оценки возвращает контекст, если удерживается исключение (пропуская оценку). Контекст [I, R] имеет функцию, которая переводит (I => R) в (Context [I, R] => Контекст [I, R]). Таким образом, нормальная функция может быть легко преобразована в контекстную функцию.

Как видите, кода не так много. Черты находятся в моем пакете утилит и могут быть использованы практически без кода потребителем. Использование библиотеки добавляет много накладных расходов для работы.

Я использую это для всех моих парсеров. Парсеры, основанные на X-Path, просто вызывают последовательность подпарсеров. Отсюда и метод оценки (Seq). Примечание: мне не нравятся методы. Я склонен использовать функции там, где могу.

Ой, я думаю, что выложил мусор в прошлый раз. Вот ссылка на GitHub. https://github.com/tyohDeveloper/acme/tree/master/src/acme/util