22

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

 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"))

我知道我可以自己写,但我想检查一下我没有重新发明轮子。

4

5 回答 5

17

使用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)
于 2011-11-04T19:26:04.160 回答
11

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

于 2011-11-04T17:52:39.940 回答
11

从 scala 2.10 开始,您可以在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
于 2014-06-16T12:30:09.087 回答
1

Scalaz 提供Validation[+E, +A]类似于Either.

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

result match {
  case Success(x) => ...
  case Failure(x) => ...
}
于 2011-11-05T17:48:35.207 回答
0

我在现代计算机中使用基于信号和非信号 NaN 的模式。NaN 表示非数字。除以零 (fp) 创建一个 NaN。sNaNs 抛出异常,非信号 NaNs 只是作为结果提供,任何未来对结果的计算也会生成一个 NaN。Evaluate 是信令, TryEvaluate 是非信令。

这里,Ctx=Context[I,R] 是一个上下文块,包含函数的输入 [I]、结果[R] 和一个异常。都是选项。上下文的更新方法是复制更新。不是变异更新。超级特征只评估一个或多个函数,将更新的上下文传递给下一个函数。如果持有异常(跳过评估),则主评估函数返回上下文。Context[I,R] 具有将 (I=>R) 转换为 (Context[I,R]=>Context[I,R]) 的函数。因此,普通函数可以很容易地转换为基于上下文的函数。

如您所见,代码不多。这些特征只是在我的实用程序包中,消费者几乎无需代码即可使用。使用库会增加所涉及工作的大量开销。

我将它用于我所有的解析器。基于 X-Path 的解析器只调用一系列子解析器。因此评估(Seq)方法。注意:我不喜欢方法。我倾向于尽可能使用函数。

哎呀,我想我上次发布了垃圾。这是一个github参考。 https://github.com/tyohDeveloper/acme/tree/master/src/acme/util

于 2019-06-22T20:29:35.453 回答