如何在 scala 中键入可能抛出异常的函数?

How to type a function in scala that may throw an exception?

我想指出函数可能会抛出异常。目前,我有以下形式的一些验证函数:

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

它的类型是 Unit 作为 return 类型,但严格来说这并不完全正确,因为该函数也可能永远不会 return 因为它可能会抛出异常。

其他语言有定义 never 类型的概念,用于无限循环或所述异常抛出。

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

Scala 中有表示这些情况的类型:

  • 类型可以通过 Try 捕获异常的概念; Try[Unit] 你的情况
  • 如果您将没有实例的类型归为 return 类型,这将表明该函数永远不会 returns,例如 Nothing

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

您可以使用 @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()
}