从Catch返回值

时间:2013-02-28 12:14:23

标签: scala try-catch

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

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

1 个答案:

答案 0 :(得分:3)

这样可以工作,但是从

开始就可能出现运行时错误
val (a,b) = whatever
只要whateverTuple2的超类型,就可以调用

- 特别是AnyRefAny,这确实是尝试/ {如果您有足够不匹配的类型,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)

获取捕获的类型检查。