如何在scala中键入可能引发异常的函数?

时间:2018-04-10 09:42:32

标签: scala exception exception-handling throwable

我想表明函数可能会抛出异常。目前,我有几个验证函数:

val throwUnlessX: String => Unit = (foo: String) => {
  if (foo != "bar") {
    throw new Throwable("Poit!")
  }
}

它以Unit作为返回类型键入,但严格来说这并不完全正确,因为函数也可能永远不会返回,因为它可能会抛出异常。

其他语言有定义never类型的概念,无论是无限循环还是抛出异常。

我可以做些什么来向开发人员表明函数可能会抛出或永远不会返回吗?

2 个答案:

答案 0 :(得分:1)

您可以使用@throws注释来声明方法可以抛出的异常。

展示示例:

class Reader(fname: String) {
  private val in = new BufferedReader(new FileReader(fname))
  @throws[IOException]("if the file doesn't exist")
  def read() = in.read()
}

答案 1 :(得分:0)

在Scala中有一些类型可以代表这些案例:

  • 类型可以使用Try捕获异常的概念;在您的情况下Try[Unit]
  • 如果您将没有实例的类型归为返回类型,则表示该函数永远不会返回,例如Nothing

但是,我强烈建议在不抛出异常的用例中使用一些验证库;例如,一个好的候选人将是Scalaz