如何映射 "Try with resources" 异常类型?
How to map a "Try with resources" exception type?
在 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()));
}
这可以用更优雅的方式完成吗?或者没有任何意义,最好 return 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
签名的一部分是没有意义的,例如Try<String, IOException>
,因为计算可能会抛出多个异常之一。
指定一组可能的异常类型也无济于事,因为当编译器计算泛型的上限时类型信息会丢失。
免责声明:我是 Javaslang 的创造者
您可以使用'visit'方法来转换故障类型。所有 cyclops-react 类型都有访问方法或 'catamorphism'。这允许您匹配该数据类型的内部状态。在 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 版本仅处理明确命名的异常,并保留该类型信息。因此,cyclops-react Try 采用两个通用参数,一个用于成功类型,一个用于最通用的推断异常类型。
cyclops-react Try 通常不会捕获正在进行的流畅操作(例如 map / flatMap 等)中的异常,尽管它可以配置为这样做。
cyclops-react Try 的一个核心设计目标是避免隐藏错误。 StackExchange answer.
有更详细的概述
在 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()));
}
这可以用更优雅的方式完成吗?或者没有任何意义,最好 return 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
签名的一部分是没有意义的,例如Try<String, IOException>
,因为计算可能会抛出多个异常之一。
指定一组可能的异常类型也无济于事,因为当编译器计算泛型的上限时类型信息会丢失。
免责声明:我是 Javaslang 的创造者
您可以使用'visit'方法来转换故障类型。所有 cyclops-react 类型都有访问方法或 'catamorphism'。这允许您匹配该数据类型的内部状态。在 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 版本仅处理明确命名的异常,并保留该类型信息。因此,cyclops-react Try 采用两个通用参数,一个用于成功类型,一个用于最通用的推断异常类型。
cyclops-react Try 通常不会捕获正在进行的流畅操作(例如 map / flatMap 等)中的异常,尽管它可以配置为这样做。
cyclops-react Try 的一个核心设计目标是避免隐藏错误。 StackExchange answer.
有更详细的概述