在Scala中,是否存在用于将异常转换为选项的预先存在的库函数?

Noe*_*edy 20 scala scala-option

这基本上是为了包装java工厂方法,如果无法根据输入创建项目,则抛出异常.我正在寻找基础库中的东西,如:

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

用法:

val id:Option[UUID] = exceptionToOption(UUID.fromString("this will produce None"))
Run Code Online (Sandbox Code Playgroud)

我知道我可以自己写,但我想检查一下,我不是在重新发明轮子.

Dan*_*ral 16

使用scala.util.control.Exception:

import scala.util.control.Exception._

allCatch opt f
Run Code Online (Sandbox Code Playgroud)

而你可以使它更复杂.例如,要仅捕获算术异常并检索异常:

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


Nic*_*las 11

是的,您可以查看该scala.util.control.Exception对象.特别是allCatch功能.


rip*_*ash 10

从scala 2.10开始,您可以在scala.util.Try中运行代码(例如工厂方法),然后将其转换为toOption:

import scala.util.Try
Try("foo".toInt).toOption  // None
Try("7".toInt).toOption    // Some(7)
Run Code Online (Sandbox Code Playgroud)

或者翻译成你原来的例子:

val id: Option[UUID] = Try(UUID.fromString("this will produce None")).toOption
Run Code Online (Sandbox Code Playgroud)