当前位置: 首页 > 知识库问答 >
问题:

如何映射“试用资源”异常类型?

孟正志
2023-03-14

在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

免责声明:我是一个新手,通常使用Cyclops React库和函数编程,因此我可能有严重的概念误解。


共有2个答案

姜乐语
2023-03-14

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

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-反应版本只处理显式命名的异常,并保留该类型信息。因此,cyclops-反应尝试采用两个通用参数,一个用于成功类型,一个用于最通用的推断异常类型。

cyclops react-Try通常不会捕捉正在进行的fluent操作(如map/flatMap等)中的异常,尽管它可以配置为这样做。

独眼巨人react Try的核心设计目标是避免隐藏bug。StackExchange答案有更详细的概述。

马臻
2023-03-14

从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)
                    );

一、 e.我们添加了Try。使用Resources功能,现在可以映射故障。

mapFailure方法采用可变数量的匹配案例。当异常不匹配(因此没有映射)时,原始异常仍然存在。

我认为将异常类型作为Try签名的一部分是没有意义的,例如Try

指定一组可能的异常类型也没有帮助,因为当编译器计算泛型的上界时,类型信息会丢失。

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

 类似资料:
  • 我在Spring MVC中测试了一些请求映射,在我的应用程序中遇到了一个奇怪的情况。我决定创建一个简单的cenario,以便您能够理解我的问题。我将首先向您展示我的项目(源代码)的详细信息,然后再开始我的问题。 我的项目中有以下目录结构: 我的Tomcat部署描述符: DispatcherServlet的我的应用程序上下文: 第1页的我的控制器类。jsp: 我的page1.jsp: 我可以访问第1

  • 我正在努力使用Java Spring Hibernate,我正在尝试实现Oauth2,在通过@ManyToMany将表用户连接到角色时,我不断遇到错误。我已经阅读了所有关于我的问题的答案,无论我尝试什么,我仍然得到了一个组织。冬眠映射异常。 以下是我正在努力做的事情的全部细节。 数据库结构 角色。JAVA 使用者JAVA 依赖性 问题: org.springframework.beans.fact

  • 首先,我对这个问题太长表示最诚挚的歉意,但老实说,我不知道如何缩短它,因为每个部分都是一个特例。诚然,我可能对此视而不见,因为我已经把头撞到墙上好几天了,我开始绝望了。 我向所有通读这本书的人表示最大的尊重和感谢。 我希望能够通过使用Jersey ExceptionMapers将Shiro的AuthenticationException及其子类映射到JAX-RS响应,Jersey例外映射器是使用G

  • 是否强制将我的外键实体从ClassA映射到ClassB中的主实体?

  • 我有一个映射到字符串值的特定键的映射列表。 类似于<代码>列表 目标:浏览此地图列表,并收集所有地图中单个键的值。 我是怎么做到的- 问题是:如果没有这样的密钥,我会因为a.get(key)而出现异常!因为求平均值会得到一个空值。如何检查或使lambda忽略任何此类地图并继续前进。 我知道我可以在

  • 我认为错误并不在注释中,因为我更改了几次注释,仍然得到了相同的异常。