,我有以下實施方案,其中我想在任何致命的異常處理合適的資源收盤:斯卡拉嘗試用最後的最佳實踐
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