确定Scala函数抛出的所有可能异常

时间:2011-12-03 12:30:40

标签: scala exception-handling

确定Scala中特定库函数可以抛出的所有异常的最佳方法是什么,以便客户端代码决定是否处理异常?

Scala没有检查异常的事实很方便,但我仍然想知道在使用特定函数时代码应该考虑的可能异常事件。

一般来说,图书馆的Scala文档似乎没有记录异常。

Scala用户如何确保其客户端代码考虑到库函数抛出的各种异常事件?

2 个答案:

答案 0 :(得分:8)

任何可以使用函数参数的库方法都可以抛出任何异常:

List(1).map(_ => throw new SomeExceptionIJustInvented)

不幸的是,这意味着,在没有复杂的基于编译器的异常跟踪系统的情况下,程序员需要了解可能基于库文档和经验生成哪些异常。

如果编写对异常具有鲁棒性的代码非常重要,那么最好的方法是从相对较大的代码块中捕获所有异常。确保你只捕获Exception,而不是所有throwable,因为你可能无法做任何与内存不足错误相关的事情。所以:

try {
  // Various stuff
}
catch {
  case e: Exception => // Handle the case where stuff fails
}

幸运的是,Java库明确说明了它们将要抛出的内容,并且Scala库几乎总是抛出很少的东西,而是传回OptionEither或者在某些事情时通过其他方式通知您除了抛出异常之外都失败了但是,使用Java库的Scala库有时会有些不透明。 (例如,如果您正在进行IO,那么IOException可能被抛出是一个非常安全的选择。)

答案 1 :(得分:2)

没有这样的一般方式。特别是,任何非final方法都可以被覆盖以抛出任何异常。