首页 文章

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

提问于
浏览
3

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

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

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

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

2 回答

  • 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库有时会有些不透明 . (例如,如果你're doing IO, it'是一个非常安全的赌注, IOException 可能被抛出 . )

  • 2

    没有这样一般的方式 . 特别是,可以重写任何非final方法以抛出任何异常 .

相关问题