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类型.
我多次阅读本节,但仍不清楚为什么检查异常不适用于高阶函数.
有人可以举一些例子来说明问题吗?
尝试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,它不知道它会抛出这种类型的异常.