所以伙计们,我一直在尝试将一些 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 提供的全部功能的惯用解决方案吗?谢谢。