代码之家  ›  专栏  ›  技术社区  ›  k0pernikus

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

  •  0
  • k0pernikus  · 技术社区  · 6 年前

    我想指出函数可能会引发异常。目前,我有以下几种验证函数:

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

    它是用 Unit 作为返回类型,但严格来说这并不完全正确,因为函数也可能永远不会返回,因为它可能会引发异常。

    其他语言有定义 never 类型,用于无限循环或所述异常引发。

    我是否可以向开发人员指出函数可能会抛出或永远不会返回?

    2 回复  |  直到 6 年前
        1
  •  1
  •   k0pernikus    6 年前

    您可以使用 @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()
    }
    
        2
  •  0
  •   mpetruska    6 年前

    在Scala中有几种类型可以表示这些情况:

    • 类型可以捕获异常的概念 Try ; Try[Unit] 在你的情况下
    • 如果将一个没有实例的类型指定为返回类型,这将表明函数永远不会返回,如 Nothing

    然而,我强烈建议对您的用例使用一些不会引发异常的验证库;一个好的候选人应该是 Scalaz 例如