gpt4 book ai didi

scala - 在 Scala 中编写 try/catch/finally 的最惯用方式?

转载 作者:行者123 更新时间:2023-12-01 22:19:39 26 4
gpt4 key购买 nike

在 Scala 中编写以下代码的最佳方式是什么?它对我来说看起来不太正确 - 首先是 2 个 val 的前向声明,然后是长的 PrintWriter 创建行,然后是 finally block 。唯一惯用的是 catch block ...

val outputStream = Try(fs.create(tmpFile))
val writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream.get)))

if (outputStream.isFailure) {
logger.error(s"Couldn't open file: $tmpFile")
}

try {

features.foreach {
case (sectionName, modelRDD) =>
writer.append("{" + sectionName + ", " + modelRDD.getNumPartitions + "}")
}

} catch {
case e: Exception =>
logger.error(s"Got exception", e)
throw e

} finally {
outputStream.get.close()
writer.close()
}

最佳答案

我们可以进一步使用初始Try的上下文来执行完整的I/O操作:

首先,我们定义一个函数来封装我们的流程:

def safeFilePrint(tf: => OutputStream)(op: PrintWriter => Unit): Try[Unit] = {
val os = Try(tf)
val write = {
val writer = os.map(f => new PrintWriter(f))
val writeOp = writer.map(op)
val flushOp = writer.map(_.flush)
writeOp.flatMap(_ => flushOp)
}
val close = os.map(_.close)
write.flatMap(_ => close)
}

和用法:

val collection = Seq(...)
val writeResult = safeFilePrint(new FileOutputStream(new File("/tmp/foo.txt"))){w =>
collection.foreach(elem => w.write(e)
}

请注意,与原始代码相比,我们有一个写操作的结果。 writeResult 将是 Success(()) 如果一切顺利或 Failure(exception) 出现问题。基于此,我们的应用程序可以进一步决定要做什么。

有人可能想知道:finally 在哪里?”在 Java 中,finally 用于确保某些代码(通常是资源管理) 将被执行,即使在 try 范围内抛出的异常会导致遵循异常处理路径。

在 Scala 中,我们使用 TryEither 或我们自己的 ADT 等结构,将错误处理提升到应用程序级别。 finally 变得不必要,因为我们的程序能够将失败作为程序的另一个有效状态来处理。

关于scala - 在 Scala 中编写 try/catch/finally 的最惯用方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41111567/

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