如何映射"尝试使用资源"异常类型?

时间:2017-03-23 14:33:21

标签: java functional-programming vavr cyclops-react

在Cyclops React"尝试使用资源"阻止,我想将IOException映射到自定义异常类型。我也尝试过Javaslang,因为它对所有异常都一视同仁,所以似乎不太灵活。

代码示例:

private static Try<String, ConnectionError> readString() {
    // Socket is a thread-local static field
    final Try<String, IOException> string = Try.catchExceptions(IOException.class)
            .init(() -> new BufferedReader(new InputStreamReader(socket.get().getInputStream())))
            .tryWithResources(BufferedReader::readLine);

    return string.isSuccess() ? Try.success(string.get()) :
            Try.failure(new ConnectionError("Could not read from server", string.failureGet()));
}

这可以用更优雅的方式完成吗?或者没有任何意义,最好还是Try<String, IOException>

免责声明:我是一名使用Cyclops React库和一般功能编程的新手,所以我可能会有严重的概念误解。

2 个答案:

答案 0 :(得分:4)

从Javaslang 2.1.0开始,可以执行以下操作:

Try<String> of = Try.withResources(() -> new BufferedReader(new InputStreamReader(socket.get().getInputStream())))
                    .of(BufferedReader::readLine)
                    .mapFailure(
                        Case(instanceOf(IOException.class), ConnectionError::new)
                    );

即。我们添加了Try.withResources功能,现在可以映射失败。

mapFailure方法需要不同数量的匹配案例。当异常未匹配(因此未映射)时,原始异常仍然存在。

我认为将例外类型包含在Try签名中是没有意义的,例如Try<String, IOException>,因为计算可能会抛出几个例外中的一个。

指定一组可能的异常类型也无济于事,因为当编译器计算泛型的上限时,类型信息会丢失。

免责声明:我是Javaslang的创建者

答案 1 :(得分:1)

您可以使用&#39;访问&#39;转换失败类型的方法。所有独眼巨人反应类型都有访问方法或“变形”#。这允许您匹配该数据类型的内部状态。在Try的情况下,它需要两个函数,一个是Try尝试成功,另一个是失败。

private static Try<String, ConnectionError> readString() {
    // Socket is a thread-local static field
    return Try.catchExceptions(IOException.class)
              .init(() -> new BufferedReader(new InputStreamReader(socket.get().getInputStream())))
              .tryWithResources(BufferedReader::readLine)
              .visit(Try::success,
                     e->Try.failure(new ConnectionError("Could not read from server", e));
}

Vavr / Javaslang Try和cyclops-react Try之间存在很大的概念/设计差异。一个或另一个可能更适合不同的用例。 (Daniel可以概述Vavr Try背后的理由)。

cyclops-react版本只处理显式名为Exceptions,并保留该类型信息。因此,cyclops-react Try需要两个通用参数,一个用于成功类型,另一个用于最常见的推断异常类型。

Cyclops-react Try通常不会捕获正在进行的流畅操作中的异常(例如map / flatMap等),尽管它可以配置为执行此操作。

独眼巨人反应尝试的核心设计目标是避免隐藏错误。有关此StackExchange answer的详细概述。