其他分享
首页 > 其他分享> > 如何映射“尝试使用资源”异常类型?

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

作者:互联网

在Cyclops React“Try with Resources”块中,我想将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库和一般功能编程的新手,所以我可能会有严重的概念误解.

解决方法:

从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签名中是没有意义的,例如尝试< String,IOException>,因为计算可能会抛出几个异常中的一个.

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

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

标签:vavr,java,functional-programming,cyclops-react
来源: https://codeday.me/bug/20190828/1753092.html