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

Spring Webflux-抛出选中的自定义异常(而不是RuntimeException)的正确方法

段干浩荡
2023-03-14

请问在Spring webflux中抛出选中的自定义异常的正确方法是什么?我想坚持,这是关于检查自定义异常,如MyException。java,而不是RuntimeException,它是关于抛出异常,而不是处理异常。

我尝试了以下方法:

@Controller
@SpringBootApplication
public class QuestionHowToThrowException {

    public static void main(String[] args) {
        SpringApplication.run(QuestionHowToThrowException.class);
    }

    @PostMapping(path = "/question", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public Mono<ResponseEntity<QuestionResponse>> question(@RequestBody QuestionRequest questionRequest) {
        Mono<FirstStep> firstStepMono = WebClient.create().post().uri("http://firstWebService:8111/getFirstStep")
                .body(questionRequest.getThing(), String.class).retrieve().bodyToMono(FirstStep.class);
        Mono<SecondStep> secondStepMono = firstStepMono.map(oneFirstStep -> getSecondStepFromFirstStepAfterCheck(oneFirstStep));
        return secondStepMono.map(oneSecondStep -> ResponseEntity.ok(new QuestionResponse(oneSecondStep.getSecondThing())));
    }

    private SecondStep getSecondStepFromFirstStepAfterCheck(FirstStep firstStep) throws MyException {
        if (firstStep.getThingNeedsToCheckCanThrowException().equals("exception")) {
            throw new MyException("exception");
        } else {
            return new SecondStep(firstStep.getThingNeedsToCheckCanThrowException() + "good");
        }
    }

    public class QuestionRequest {
        private String thing;
        public String getThing() {
            return thing;
        }
    }

    public class QuestionResponse {
        private String response;
        public QuestionResponse(String response) {
            this.response = response;
        }
    }

    public class FirstStep {
        private String thingNeedsToCheckCanThrowException;
        public String getThingNeedsToCheckCanThrowException() {
            return thingNeedsToCheckCanThrowException;
        }
    }

    public class SecondStep {
        private String secondThing;
        public SecondStep(String secondThing) {
            this.secondThing = secondThing;
        }
        public String getSecondThing() {
            return secondThing;
        }
    }

}

这是不可能的,因为get秒dStepFromFirstStepAfterCheck方法中存在未处理的异常。

如果我抛出并传播,私有的SecondStep getSecondStepFromFirstStepAfterCheck(FirstStep FirstStep)抛出我的异常lambda调用方方法不愉快。

请问,在webflux中引发自定义异常的最干净和正确的方法是什么?

非常感谢。

共有2个答案

呼延运恒
2023-03-14

对于我们的应用程序,我们有从RuntimeException扩展而来的自定义基异常。然后,我们有标准的异常处理,在将结果返回给最终用户之前,它会为特殊处理查找自定义异常。这允许我们使用普通抛出机制,因为我们希望抛出的所有异常都能波及调用的顶层。

对于性能问题,webflux和reactive在每次调用的基础上的性能稍低,尤其是对于不需要进行任何并行化的调用。然而,一旦加载到系统上,它的性能往往会变得更高,主要与垃圾收集有关。map和flatMap之间的差异产生的开销最好可以忽略不计。

钱运浩
2023-03-14

通过阅读示例代码,您似乎试图在Mono上引入一些错误处理。

您可以通过扩展RuntimeException类来创建未经检查的异常。如果您想要一个强制处理的检查异常,您可以简单地扩展Exception

public class MyException extends RuntimeException {
    public MyException(String msg) {
       super(s);
    }
}

对Reactor项目抛出异常的最干净的方法实际上就是抛出它。有一些错误处理函数允许您为某些错误情况提供不同的流。

好消息是您有几个选项可以为错误处理提供一些流控制。

Project Reactor在Mono对象上提供了其中几种方法。

在Error()上执行在错误继续()上执行在错误返回()上执行在ErrorS top()上执行在错误映射()上执行

我不完全确定您试图用以下示例代码实现什么。

 return Mono.error(new MyException("exception"));
        } else {
 return Mono.just(new SecondStep(firstStep.getThingNeedsToCheckCanThrowException() + "good"));

但这看起来像是一个很好的例子,因为它看起来像是您试图在这里翻译一些异常

return Mono.just(new SecondStep(firstStep.getThingNeedsToCheckCanThrowException() + "good")
   .onErrorMap(e -> "translated result");
 类似资料:
  • 在许多地方,我得到了几个已检查的异常,如IOException、ParseException、JSoneException等。我必须做出两个选择之一- > 通过在方法签名的末尾添加抛出来抛出相同的异常。 将检查的异常包装在RuntimeException(或一些自定义实现)中,然后抛出它,以便调用者不必在任何地方添加throws子句并检查异常。 在第一种情况下,我将不得不到处抛出,但我的客户可以通

  • 问题内容: 我是刚接触Reactor和反应式编程的新手。 我目前正在编写类似于以下代码: 这个例子可能很愚蠢,确实有更好的方法来实现这种情况,但是重点是: 在块中使用异常是错误的还是应该将其替换为? 这两种方式有什么实际区别? 问题答案: 有几种方法可以被视为方便的异常抛出方法: 可以简化可能导致错误或空流的元素处理的一种方法是operator 。 以下代码显示了如何使用它来解决问题: 如我们所见

  • 我是一个新的项目Reactor和反应编程一般。 我目前正在编写一段类似于以下内容的代码: 这两种做法有什么实际区别吗?

  • 我试图抛出一个自定义的异常(即400与一些错误消息)从Spring引导控制器,不知何故它总是抛出500而不是 我创建了一个异常处理程序来处理从控制器调用的服务引发的自定义异常,该控制器假定返回400。当我调试它时,我可以看到它实际上已被调用,但它没有作为响应直接抛出,如果我进行调试,我可以看到BasicErrorController仍将被调用(我认为不应该这样,因为我有一个自定义的异常处理程序,请

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

  • 我是一名Java编程新手(实际上已经在学习),我对如何处理不同的消息有些怀疑。 我的目标是将这些不同的消息包含在同一个类(CustomExcpse类)中,以避免在从其他类抛出新CustomExceptions的每个方法上一遍又一遍地编写相同的字符串。 到目前为止,我编码: > 一个自定义异常类,它从异常扩展而来,具有不同的消息(在示例中只有两个,但还有更多)作为Strings包含,当然还有构造函数