gpt4 book ai didi

scala - for 表达式中使用默认值进行异常处理

转载 作者:行者123 更新时间:2023-12-02 21:55:29 26 4
gpt4 key购买 nike

各位,我一直在尝试将书中的一些 Java 代码示例转换为惯用的 Scala,只是为了加强我的 Scala 学习。我对小事情很满意,但在使用 for 表达式时无缝处理异常让我感到困惑。

前提是:给定一个主机名列表,检索一个主机名/IP 地址元组列表。听起来很简单,并且在良好的情况下工作得很好,即

  def printHostInfo(args: Array[String]) {
val tuples = for {
arg <- args
inet <- InetAddress.getAllByName(arg.trim)
} yield (inet.getHostName, inet.getHostAddress)
println(tuples mkString "; ")
}

但现在困难的部分来了:我想轻松处理输入错误主机名时发生的异常。我可以使用新的 Try 构造,但它只是回避了问题。

def printHostInfo(args: Array[String]) {
val tuples = for {
arg <- args
inet <- Try(InetAddress.getAllByName(arg.trim)) getOrElse Array()
} yield (inet.getHostName, inet.getHostAddress)
println(tuples mkString "; ")
}

在上面的代码片段中,如果主机名错误,则跳过该条目,我们都很高兴。 但是,我想要做的是在主机错误的情况下,检索像 (www.hostname.com, Bad host name) 这样的元组。我尝试摆弄 Option 和其他东西,但出现编译时错误,我还没有资格破译。有人可以建议一个简洁且使用 Scala 提供的全部功能的惯用解决方案吗?谢谢。

最佳答案

我最初的意思是这样结束:

def printHostInfo(args: Array[String]) = {
val tuples = for {
arg <- args
} yield Try[Seq[(String,String)]](InetAddress.getAllByName(arg.trim)
.map(inet => (inet.getHostName, inet.getHostAddress))) getOrElse List((arg.trim,"Bad host name"))
println(tuples.flatten mkString ";")
}

这不是优雅的代码。

这是一个“功能性”重新设计,保留了 Try 的用法:

def printHostInfo1(args: Seq[String]) = {
def hostToTuple(inet: InetAddress) = (inet.getHostName, inet.getHostAddress)

val hosts = args.flatMap(arg =>
Try(InetAddress.getAllByName(arg.trim).map(hostToTuple(_)))
getOrElse Array((arg.trim,"Bad host name")))

println(hosts mkString ";")
}

一般来说,我不知道我现在是否清楚地解释了这一点,但我的观点是您应该尽可能“向下”推迟异常处理。在我看来,你最终遇到的问题是你太早处理了异常,现在你陷入了类型系统的阻碍而不是帮助你(注意:这种事情在具有动态类型的语言,例如 Python)。

有鉴于此,这里有一个简单的迭代替代方案:

def printHostInfo3(args: Array[String]) {
val tuples = for(arg <- args)
yield try {
for(inet <- InetAddress.getAllByName(arg.trim))
yield (inet.getHostName, inet.getHostAddress)
} catch {
case e: Exception => Array((arg.trim, "Bad host name"))
}

println(tuples.flatten mkString ";")
}

关于scala - for 表达式中使用默认值进行异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17899347/

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