,我有以下实施方案,其中我想在任何致命的异常处理合适的资源收盘:斯卡拉尝试用最后的最佳实践
private def loadPrivateKey(keyPath: String) = {
def tryReadCertificate(file: File): Try[BufferedReader] = Try { new BufferedReader(new FileReader(file)) }
def tryLoadPemParser(reader: BufferedReader): Try[PEMParser] = Try { new PEMParser(reader) }
def createXXX(buffReader: BufferedReader, pemParser: PEMParser) = try {
...
} finally {
buffReader.close()
pemParser.close()
}
tryReadCertificate(new File(keyPath, "myKey.pem")) match {
case Success(buffReader) => tryLoadPemParser(buffReader) match {
case Success(pemParser) => createXXX(buffReader, pemParser)
case Failure(fail) =>
}
case Failure(fail) =>
}
}
我已经看到我的巢式病例块是一个烂摊子。有一个更好的方法吗?最后,我只想确保关闭BufferedReader
和PEMParser
!
'Try'使得当它是你想要的类型最有意义无论出于何种原因而不是例外,都会返回到您的API中看起来这个例子并没有使用'Try'的任何特性,所以最简单的解决方案就是不使用它。否则,不要在你的内部函数中使用它,而只能在外部表达式中使用它。 – jrudolph 2014-11-20 16:41:25
可能不是你想要的答案,但我认为最好的做法是使用[scala-arm](https://github.com/jsuereth/scala-arm)。 – lmm 2014-11-20 16:59:50
我不想使用scala-arm – sparkr 2014-11-21 14:49:05