我的应用程序从文件中读取一些配置值。如果过程中出现任何错误,我想为这些配置参数设置默认值。我正在做的是:
val (param1, param2) = {
try{
val props = new java.util.Properties
props.load(getClass.getResource("/myapp.properties").openStream)
(
props.getProperty("param1", "default1"),
props.getProperty("param2", "default2")
)
}
catch{
case _ => ("default1", "default2")
}
}
我知道如果出现异常,我在 catch block 中所做的事情将不会按预期工作。有办法解决吗?我使用的是 Scala 2.9
最佳答案
这可以工作,但它可能会出现运行时错误
val (a,b) = whatever
只要 whatever
是 Tuple2
的父类(super class)型就可以被调用 - 特别是,它可以是 AnyRef
或 Any
,如果您有足够不匹配的类型,这确实是 try/catch 返回值将被扩展的值。您可以通过添加类型描述来确保它是正确的类型:
val (a,b): (A, B) = whatever
然后,如果右侧的类型在整个 try/catch 过程中都不是正确的类型,类型检查器就会发出提示。
例如:
val (a,b): (String, String) = try {
("perch", if (scala.util.Random.nextBoolean) throw new Exception else "halibut")
} catch {
case e: Exception => ("salmon", "herring")
}
如果您尝试在 "herring"
之后添加 , "cod"
,您会收到编译时错误。如果重复输入此分配,则一半时间为 a=鲈鱼和 b=大比目鱼,另一半时间为 a=鲑鱼和 b=鲱鱼。
附录:在 2.9 中(或者更低,我猜想,虽然我没有检查过),你必须将类型归属放在 try/catch 语句上,如下所示:
val (a,b) = (try {
("perch", if (scala.util.Random.nextBoolean) throw new Exception else "halibut")
} catch {
case e: Exception => ("salmon", "herring")
}): (String, String)
对捕获进行类型检查。
关于scala - Catch 的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15135310/