不清楚"Scala函数式编程"中的"Checked exception"解释

Fre*_*ind 2 functional-programming scala higher-order-functions checked-exceptions

在"Scala中的函数式编程"一书中,有一些词汇谈论"已检查的异常":

检查异常

Java检查的异常至少会强制决定是否处理或重新报告错误,但它们会为调用者带来重要的样板.更重要的是,它们不适用于高阶函数,它们不可能知道它们的参数可能引发的特定异常.例如,考虑我们为List定义的map函数:

def map[A,B](l: List[A])(f: A => B): List[B]

这个函数显然很有用,非常通用,并且与使用已检查的异常不一致 - 我们不能为每个可能抛出的单个检查异常提供一个map版本f.即使我们想要这样做,地图甚至会知道哪些例外是可能的?这就是为什么通用代码,即使在Java中,也常常使用RuntimeException或一些常见的检查Exception类型.

我多次阅读本节,但仍不清楚为什么检查异常不适用于高阶函数.

有人可以举一些例子来说明问题吗?

try*_*ryx 6

尝试map<A, B>用Java 编写函数.在某些时候,你会发现自己需要调用你的映射函数.您的映射函数可以是任何东西,并抛出它喜欢的任何类型的异常.该函数map不能在其签名中包含映射器可以抛出的所有可能的异常,因为它不知道它是什么.map使用已检查的异常编写类型签名是不可能的.

假设签名map是这样的Colletion<B> map<A, B>(Function<A,B>, Collection<A>).现在假设我们称之为map(x -> throw new IOException, Lists.of(1,2,3)).自IOException检查以来,它应该出现在签名中map但是在你打电话之前map,它不知道它抛出这种类型的异常.