gpt4 book ai didi

scala - 使用 Either 处理 Scala 代码中的故障

转载 作者:行者123 更新时间:2023-12-03 06:05:52 25 4
gpt4 key购买 nike

Option monad 是在 Scala 中处理有或无事物的一种很好的表达方式。但是,如果在“什么也没发生”时需要记录一条消息怎么办?根据 Scala API 文档,

The Either type is often used as an alternative to scala.Option where Left represents failure (by convention) and Right is akin to Some.

但是,我没有运气找到使用 Either 的最佳实践或涉及 Either 处理失败的良好现实示例。最后,我为自己的项目编写了以下代码:

    def logs: Array[String] = {
def props: Option[Map[String, Any]] = configAdmin.map{ ca =>
val config = ca.getConfiguration(PID, null)
config.properties getOrElse immutable.Map.empty
}
def checkType(any: Any): Option[Array[String]] = any match {
case a: Array[String] => Some(a)
case _ => None
}
def lookup: Either[(Symbol, String), Array[String]] =
for {val properties <- props.toRight('warning -> "ConfigurationAdmin service not bound").right
val logsParam <- properties.get("logs").toRight('debug -> "'logs' not defined in the configuration").right
val array <- checkType(logsParam).toRight('warning -> "unknown type of 'logs' confguration parameter").right}
yield array

lookup.fold(failure => { failure match {
case ('warning, msg) => log(LogService.WARNING, msg)
case ('debug, msg) => log(LogService.DEBUG, msg)
case _ =>
}; new Array[String](0) }, success => success)
}

(请注意,这是来自真实项目的片段,因此它不会自行编译)

如果您知道您如何在代码中使用 Either 和/或重构上述代码的更好想法,我将不胜感激。

最佳答案

Either 用于返回两个可能的有意义结果之一,而 Option 则用于返回单个有意义的结果或不返回任何结果。

下面给出了一个易于理解的示例(不久前在 Scala 邮件列表上流传):

def throwableToLeft[T](block: => T): Either[java.lang.Throwable, T] =
try {
Right(block)
} catch {
case ex => Left(ex)
}

顾名思义,如果“block”执行成功,就会返回“Right( )”。否则,如果抛出 Throwable,它将返回“Left( )”。使用模式匹配来处理结果:

var s = "hello"
throwableToLeft { s.toUpperCase } match {
case Right(s) => println(s)
case Left(e) => e.printStackTrace
}
// prints "HELLO"

s = null
throwableToLeft { s.toUpperCase } match {
case Right(s) => println(s)
case Left(e) => e.printStackTrace
}
// prints NullPointerException stack trace

希望有帮助。

关于scala - 使用 Either 处理 Scala 代码中的故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1193333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com