如何将 Mono 的异常映射到另一个异常

问题描述 投票:0回答:1

我在 Spring Webflux (Java 20) 中有一个端点,它接收 UUID 字符串,我需要使用 UUID.fromString 对其进行验证。如果后者因为 String 格式错误而抛出异常,如何捕获并重新抛出异常?

这是显示问题的最简单的代码片段,我尝试捕获 IllegalArgumentException 并将其传播为 AssertionError。

public class Main {
    public static void main(String[] args) {
            Mono.just(UUID.fromString("123")).doOnError(IllegalArgumentException.class, e ->     Mono.error(new AssertionError(""))).subscribe();
    }
}
Mono.just(UUID.fromString("123")).onErrorMap(IllegalArgumentException.class, e -> new AssertionError("")).subscribe();
Mono.just(UUID.fromString("123")).onErrorResume(e -> Mono.error(new AssertionError("hello"))).subscribe();

无论我尝试什么,结果总是 IllegalArgumentException 没有被捕获并且只是冒泡

Exception in thread "main" java.lang.IllegalArgumentException: Invalid UUID string: 123
    at java.base/java.util.UUID.fromString1(UUID.java:280)
    at java.base/java.util.UUID.fromString(UUID.java:258)
    at org.example.Main.main(Main.java:12)
java reactive-programming project-reactor
1个回答
0
投票

Spring Webflux 中的运算符旨在处理反应式流处理期间发生的错误,例如上游发布者或运算符发出的错误。 它们不会捕获使用

UUID
 初始创建 
UUID.fromString 期间发生的异常。

但是,您可以使用简单的 try-catch 块来处理它:

try {
    UUID uuid = UUID.fromString("123");
    Mono.just(uuid).subscribe();
} catch (IllegalArgumentException e) {
    throw new AssertionError("Invalid UUID string", e);
}
© www.soinside.com 2019 - 2024. All rights reserved.