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

3
什么是在Scala中确定特定库函数可能抛出的所有异常的最佳方法,以便客户端代码决定是否处理异常?
尽管Scala没有受检异常,但我仍然想知道使用特定函数时应该考虑哪些可能的异常事件。
总体而言,Scala库的文档似乎并未记录异常情况。
Scala用户如何确保客户端代码考虑到库函数可能抛出的各种异常情况?

1
只是提醒一下:在直接处理异常方面,Scala并没有任何特殊之处,Java才是!大多数编程语言都没有检查异常... - agilesteel
据我所知,大多数方法在必须引发异常时,会返回一个Either,以便您可以轻松处理错误状态。 - aishwarya
我不知道这个项目的状态,但是Inhibitions可以让编译器验证哪些异常可以被抛出(通过分析字节码中可能的代码路径)。您可以在http://days2011.scala-lang.org/node/138/292上观看Scala Days 2011的视频。 - Mike
2个回答

8
任何可以接受函数参数的库方法都可能抛出任何异常:
List(1).map(_ => throw new SomeExceptionIJustInvented)

不幸的是,缺乏一个复杂的编译器异常跟踪系统,程序员需要依靠库文档和经验了解可能引发的异常。

如果编写可靠的异常处理代码非常重要,那么最好的方法是捕获比较大的代码块中抛出的所有异常。确保仅捕获Exception,而非所有可抛出的对象,因为你可能无法对内存溢出错误执行任何合理的操作。所以:

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

幸运的是,Java库明确说明它们将要抛出什么异常,而Scala库几乎不会抛出很多异常,而是返回OptionEither或采用其他方式通知您当某些操作失败时。然而,使用Java库的Scala库有时可能有点难以理解。(例如,如果您正在进行IO操作,那么可以肯定IOException可能会被抛出。)


谢谢,回答了我的问题。我会更仔细地看一下 Either。 - Symfrog

2

并没有通用的方法。特别地,任何非final方法都可以被重写以抛出任何异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接