gpt4 book ai didi

scala - for 表达式中默认的异常处理

转载 作者:行者123 更新时间:2023-12-02 04:56:31 24 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/

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