scala - Catch 的返回值

标签 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 block 中所做的事情将不会按预期工作。有办法解决吗?我使用的是 Scala 2.9

最佳答案

这可以工作,但它可能会出现运行时错误

val (a,b) = whatever

只要 whateverTuple2 的父类(super class)型就可以被调用 - 特别是,它可以是 AnyRefAny ,如果您有足够不匹配的类型,这确实是 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/

相关文章:

scala - 我是否遵循 BDD 规范?

scala - 如何从 Argonaut Json 对象中删除具有空值的键

scala - 基于成功的结果失败的 future

java - 尝试从另一种方法中捕获

java - 输入整数错误抛出

scala - 嵌入式 Jetty 9. 创建 Scala servlet

scala - 为什么抽象类型的具体实现不能用于推断 ClassTag?

c# - 捕获 foreach 条件中抛出的异常

python 在预期异常后返回到 try block

java - 当问题没有适当的解决方案时,有什么建议?