确定Scala中特定库函数可以抛出的所有异常的最佳方法是什么,以便客户端代码决定是否处理异常?
Scala没有检查异常这一事实很方便,但我仍然想知道代码在使用特定函数时应该考虑的异常事件 .
通常,库的Scala文档似乎不记录异常 .
Scala用户如何确保他们的客户端代码考虑到库函数抛出的各种异常事件?
任何可以接受函数参数的库方法都可以抛出任何异常:
List(1).map(_ => throw new SomeExceptionIJustInvented)
不幸的是,这意味着,在没有复杂的基于编译器的异常跟踪系统的情况下,程序员需要了解可能基于库文档和经验生成哪些异常 .
如果编写对异常具有鲁棒性的代码非常重要,那么最好的方法是从相对较大的代码块中捕获所有异常 . 确保你只捕获 Exception ,而不是所有throwable,因为你可能无法做任何与内存不足错误相关的事情 . 所以:
Exception
try { // Various stuff } catch { case e: Exception => // Handle the case where stuff fails }
幸运的是,Java库明确地说明了它们将要抛出的内容,并且Scala库几乎总是抛出很少的东西,而是传回 Option 或 Either ,或者除了抛出异常之外还有一些其他方法可以通知你 . 但是,使用Java库的Scala库有时会有些不透明 . (例如,如果你're doing IO, it'是一个非常安全的赌注, IOException 可能被抛出 . )
Option
Either
IOException
没有这样一般的方式 . 特别是,可以重写任何非final方法以抛出任何异常 .
2 回答
任何可以接受函数参数的库方法都可以抛出任何异常:
不幸的是,这意味着,在没有复杂的基于编译器的异常跟踪系统的情况下,程序员需要了解可能基于库文档和经验生成哪些异常 .
如果编写对异常具有鲁棒性的代码非常重要,那么最好的方法是从相对较大的代码块中捕获所有异常 . 确保你只捕获
Exception
,而不是所有throwable,因为你可能无法做任何与内存不足错误相关的事情 . 所以:幸运的是,Java库明确地说明了它们将要抛出的内容,并且Scala库几乎总是抛出很少的东西,而是传回
Option
或Either
,或者除了抛出异常之外还有一些其他方法可以通知你 . 但是,使用Java库的Scala库有时会有些不透明 . (例如,如果你're doing IO, it'是一个非常安全的赌注,IOException
可能被抛出 . )没有这样一般的方式 . 特别是,可以重写任何非final方法以抛出任何异常 .