我的应用程序从文件中读取一些配置值。如果进程中有任何错误,我想为这些配置参数设置默认值。我在做的是:
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块中所做的事情将无法按预期工作。有办法解决吗?我正在使用Scala 2.9
答案 0 :(得分:3)
这样可以工作,但是从
开始就可能出现运行时错误val (a,b) = whatever
只要whatever
是Tuple2
的超类型,就可以调用 - 特别是AnyRef
或Any
,这确实是尝试/ {如果您有足够不匹配的类型,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")
}
如果您尝试在, "cod"
之后添加"herring"
,则会出现编译时错误。如果重复输入,这个赋值将给你一个= perch和b = halibut的一半时间和a = salmon和b = herring另一半。
附录:在2.9(或以下,我认为,虽然我没有检查过),你必须在try / catch语句中输入类型ascription:
val (a,b) = (try {
("perch", if (scala.util.Random.nextBoolean) throw new Exception else "halibut")
} catch {
case e: Exception => ("salmon", "herring")
}): (String, String)
获取捕获的类型检查。