如何在 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()
}
我想指出函数可能会抛出异常。目前,我有以下形式的一些验证函数:
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() }