我试图理解Try如何在scala中工作(不是尝试/ catch)但是尝试。例如,在这里我想检查文件是否存在,如果是,我将在稍后的代码中使用文件中的数据,但它不起作用:
val texte = Try(Source.fromFile(chemin_texte).getLines().filter(_!="").foldLeft(""){_+_})
texte match {
case Success(x) => x
case Failure(e) => println("An error occured with the text file"); println("Error: " + e.getMessage)
}
/*phrases du texte*/
val phrases_txt = split_phrases(texte).map(phrase => phrase)
在val phrases_txt
如果文件存在,我希望使用texte
的输出,否则程序应该在Failure(e)
暂停。
我得到的错误是类型不匹配;发现:scala.util.Try[String] required: String
。
有任何帮助吗?感谢。
答案 0 :(得分:1)
将Try
视为可能失败的计算的容器。它与try和catch块无法比较,因为它们只是" throw"例外情况,预计将在稍后的程序中处理。 Scala Try
强制您确保在程序中始终处理可能的错误。
您可以这样做:
val texte = Try(Source.fromFile(chemin_texte).getLines().filter(_!="").foldLeft(""){_+_})
val phrases: Try[List[String]] = texte.map(split_phrases)
我没有看到.map(phrases => phrases)
的重点,因为它会返回相同的对象。 map
函数的类型为T[A] => T[B]
,这意味着对于值为A
的容器,map
将运行给定的函数f
在容器的内容上,生成一个B
类型的容器,其中函数f
负责将A
类型的对象转换为B
类型}。
如果您希望在程序中进一步使用phrases
对象生成Try
值的其他值,则可以使用flatMap
函数或for
表达式生活更轻松。例如:
val morePhrases: Try[List[String]] = ???
def mergePhrases(phrases1: List[String], phrases2: List[String]): Phrases = phrases1 ++ phrases2
val mergedPhrases: Try[List[String]] = for {
p1 <- phrases
p2 <- morePhrases
} yield mergePhrases(p1, p2) // Only for demonstration, you could also do yield p1 ++ p2
上面代码中的mergedPhrases
值只是一个Try
容器,其中包含mergePhrases
和phrases
内容的morePhrases
函数应用结果。
请注意,Try
块可能总是是在程序结束时捕获错误的最佳方式,您发现了第一个错误,但是您赢了# 39;不知道错误到底是什么。这就是为什么我们有像Either
这样的东西。