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

在可完成未来运行异步中引发异常时出现问题

麻学博
2023-03-14

我正在开发一个微服务应用程序,在服务布局中,我想使用可完成的未来.runAsync()调用。问题是当我想抛出异常时,我有自己的处理程序异常,但是当它在 CompletedFuture 中的捕获块中生成时,我无法捕获错误,如下所示:

控制器:

@PostMapping(path="/offers/offer")
    public CompletableFuture<Oferta> infoPropiedad(@Valid @RequestBody OfertaRequest inDTO) throws 
    WebServiceBadResponseException, SOAPException, IOException, InterruptedException, ExecutionException  {
        System.out.println("THREAD: "+Thread.currentThread().getName());
        CompletableFuture<Oferta> outTO = new CompletableFuture<Oferta>();
        
        return CompletableFuture.supplyAsync(()->{
            try {
                return ofertasService.ofertasService(inDTO);
            } catch (Exception e) {
                System.out.println("Error inesperado en la capa del controlador");
            }
            return null;
        });
    }

服务:

CompletableFuture<OfertaCrm> completableFutureCRM = 
                CompletableFuture.supplyAsync(()->  {
                    try {
                        return clientOferta.llamadaWebServiceOfertas(inDTOCrm);
                    } catch (Exception e1) {
                        //throw Exception and capture it with my handler class
                    }
                });

客户:

    public OfertaCrm llamadaWebServiceOfertas(OfertaRequestCRM inDtoCrm) 
            throws SOAPException, IOException {

                CompletableFuture<OfertaCrm> completableFuture = new CompletableFuture<OfertaCrm>();
                
                logger.info("Iniciamos la llamada al WS");
//Error produces here and I want to controle it and capture with my handler class

错误处理程序:

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler({
        WebServiceBadResponseException.class,
        SOAPException.class,
        IOException.class
    })
    @ResponseBody
    public ErrorMessage internalError(Exception exception) {
        return new ErrorMessage(exception,exception.getMessage());
    }

我不可能使用正确的形式。知道如何在supplyAsync块中抛出异常吗?

共有1个答案

蓝恩
2023-03-14

可完成未来会将执行中引发的异常包装在完成异常中。您可以通过直接拦截根本原因异常来处理它。下面是一个简化的示例。

控制器:

@RestController
public class SimpleController {
    @Autowired
    SimpleService simpleService;

    @GetMapping("/testing")
    public CompletableFuture<Integer> testing(){
        return simpleService.doStuff();
    }
}

服务:

@Service
public class SimpleService {

    public CompletableFuture<Integer> doStuff(){
        // 1 / 0 will throw ArithmeticException
        return CompletableFuture.supplyAsync(() -> 1 / 0);
    }
}

控制器建议:

@RestControllerAdvice
public class SimpleControllerAdvice {

    @ExceptionHandler(ArithmeticException.class)
    public String handleCompletionException(ArithmeticException ex){
        return "hello world";
    }
}

GET/测试
你好世界

 类似资料:
  • 问题内容: 当我编译下面的代码时,出现以下错误: 代码: 我已经宣布要抛出它。我想念什么? 完整代码在https://github.com/spakai/composite_indexes中 问题答案: 从Java 8开始,检查异常比Java承诺的要早得多,并且不能与它们很好地配合使用。从技术上讲,BiFunction不会声明抛出任何检查异常。因此,您传递给的,也不能将其抛出。 请通过继承选中。还

  • 如果一个字段在可完成的未来代码中为空,我必须发送一个异常: 这个想法是,如果孩子的字段为空(在本例中为lastName),我必须抛出一个自定义异常,我不太确定如何实现这一点。 我的想法是使用thenAccept方法发送异常,如下所示: 我必须评估数据库中的lastName是否为空,我必须抛出一个异常。 有什么想法吗?

  • 当我编译下面的代码时,我得到以下错误: 代码: 我已经宣布它被扔掉了。我错过了什么? 完整的代码在https://github.com/spakai/composite_indexes

  • 在Eclipse中运行JUnit测试时,我会收到以下错误: 虽然我使用的是maven,但我尝试在类路径中添加库,并且JUnit库位于POM依赖项中。 我已经尝试过清理该项目,并使用Eclipse的JUnit插件创建了一个新的JUnit测试用例,但仍然得到相同的错误。

  • 已完成未来() 返回已使用给定值完成的。 我们如何构造一个已经异常完成的< code>CompletableFuture? 也就是说,我希望future抛出一个异常,而不是返回值。

  • 有人能帮我解决这个问题吗?