2

我的应用程序从文件中读取一些配置值。如果过程中有任何错误,我想为这些配置参数设置默认值。我正在做的是:

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

4

1 回答 1

4

这将起作用,但它打开了运行时错误的可能性,因为

val (a,b) = whatever

只要whatever是的超类型,就可以调用Tuple2-- 特别是,它可以是AnyRefor 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")
}

如果您在收到编译时错误, "cod"后尝试添加。"herring"如果重复输入此作业,则一半时间为 a=perch 和 b=halibut,另一半时间为 a=salmon 和 b=herring。


附录:在 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)

获得捕获的类型检查。

于 2013-02-28T12:31:27.010 回答