【问题标题】:Not clear about the "Checked exception" explanation in "functional programming in Scala"不清楚“Scala中的函数式编程”中的“Checked exception”解释
【发布时间】:2015-07-14 09:20:45
【问题描述】:

在《Scala 中的函数式编程》一书中,有一段话讲到了“受检异常”:

检查的异常

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

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

这个函数显然很有用,高度通用,并且与检查异常的使用不一致——我们不能为 f 可能抛出的每个检查异常都提供一个 map 版本。即使我们想这样做,map 怎么会知道哪些异常是可能的呢?这就是为什么通用代码,即使是在 Java 中,也经常求助于使用 RuntimeException 或一些常见的检查异常类型。

这部分我读了好几遍,但仍然不清楚为什么已检查异常不适用于高阶函数

有人可以举一些例子更清楚吗?

【问题讨论】:

    标签: scala functional-programming higher-order-functions checked-exceptions


    【解决方案1】:

    尝试用Java编写函数map<A, B>。在某些时候,您会发现自己需要调用映射函数。您的映射函数可以是 anything 并抛出它喜欢的任何类型的异常。函数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,它才知道它可能抛出这种类型的异常。

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 2011-10-23
      • 2021-08-23
      • 1970-01-01
      相关资源
      最近更新 更多