对于我的第一个Scala程序,我正在尝试编写一个小工具,它将XML文件从一个模式转换为另一个模式。
我开始编写一个方法,它会给我文件内容:
def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = {
try
{
val source = scala.io.Source.fromFile(filename, encoding)
val contents = source.mkString
source.close()
return Some(contents)
}
catch
{
return None
}
}
但它没有编译。我回复“值apply不是Nothing的成员”和“value isDefinedAt不是Nothing的成员”作为来自行return None
的错误消息。
我可以找到返回选项使用匹配的所有示例,但这在这里没有意义。如果由于某种原因我无法读取文件,我只想不失败。
在这种情况下我该怎么办?在Scala中有这种做事的模式吗?
答案 0 :(得分:7)
在这种特殊情况下(异常处理),我建议改为使用Try。
def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = {
Try {
val source = scala.io.Source.fromFile(filename, encoding)
val contents = source.mkString
source.close()
return Some(contents)
}.toOption
}
但是,我会建议不要删除异常。您通过返回None
来吞下导致错误的原因:它是FileNotFoundException
吗?标准IOException
?是否有错误消息(Unsupported encoding
会想到......)?
我的经验法则是让调用者处理异常。如果他不关心错误本身,处理事情就像:
Try {loadFile("test.txt")}.toOption
更好的是,由于Try
具有所有必需的方法,因此可以以相当简洁的方式用于理解:
for(s <- Try {loadFile("test.txt")};
i <- Try {s.toInt}) yield i
这会导致Success[Int]
或Failure
包含一个描述错误内容的异常。
答案 1 :(得分:5)
所有关于"catch"
。
在scala中,它应该是这样的,以便编译:
def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = {
try {
val source = scala.io.Source.fromFile(filename, encoding)
val contents = source.mkString
source.close()
Some(contents)
} catch {
case x: IOException => None
case x => errorHandler(x) // if any other exception
}
}
def errorHandler(e: Any) = None // put some logic here..
所以使用:
catch { case: x:ExceptionType ={ .. handling .. }}
在Scala中catch
是一个接受另一个函数作为参数的函数。因此,拥有你所拥有的东西会抱怨应用功能。 case
提供catch
想要的函数(PartialFunction)。 (简而言之)
注意: unchecked
甚至Scala
中的所有例外都是IOException
。
答案 2 :(得分:0)
试试这个:
def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = {
try
{
val source = scala.io.Source.fromFile(filename, encoding)
val contents = source.mkString
source.close()
return Some(contents)
}
catch
{
case e:Exception=>{
return None
}
}
}