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

Sym*_*rog 3 scala exception-handling

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

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

通常,库的Scala文档似乎不记录异常.

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

Rex*_*err 8

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

List(1).map(_ => throw new SomeExceptionIJustInvented)
Run Code Online (Sandbox Code Playgroud)

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

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

try {
  // Various stuff
}
catch {
  case e: Exception => // Handle the case where stuff fails
}
Run Code Online (Sandbox Code Playgroud)

幸运的是,Java库明确地说明了它们将要抛出的内容,并且Scala库几乎总是抛出很少的东西,而是通过传回Option或者Either或者有其他方式通知你什么时候失败而不是抛出异常.但是,使用Java库的Scala库有时会有些不透明.(例如,如果你正在做IO,这是一个非常安全的赌注,IOException可能会被抛出.)