В 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"))
Я знаю, что могу написать свой собственный, но я хочу проверить, что я не изобретаю колесо.
Ответы
Ответ 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