我有一个方法,当用户单击按钮时,它会调用另一个方法并调用 WebClient 等。基本上,WebClient 会引发异常,但调用方法没有捕获它。
例如,这是一个缩短的版本:
调用方法
try {
service.getMessageAsync(messageDto, results -> getUI().ifPresent(ui -> ui.access(() -> {
.... code here ....
})));
} catch (RuntimeException e) {
logger.error("RuntimeException (startEtl):");
logger.error("\tException: {0}", e);
}
服务方式
public void getMessageAsync(MessageDto messageDto, AsyncRestCallback<MessageDto> callback)
throws RuntimeException {
... code omitted ...
WebClient.RequestHeadersSpec<?> spec = WebClient
.create()
.post()
.uri(URI)
.body(Mono.just(messageDto), MessageDto.class)
.headers(httpHeaders -> httpHeaders.setBasicAuth(username, password));
spec
.retrieve()
.onStatus(HttpStatus::is4xxClientError, error -> Mono.error(new RuntimeException("4xx Client Error.")))
.onStatus(HttpStatus::is5xxServerError, error -> Mono.error(new RuntimeException("5xx Server Error.")))
.toEntityList(MessageDto.class).subscribe(result -> {
callback.operationFinished(message.get(0));
});
}
所以,在我的日志中,我可以清楚地看到这些4xx Client Error.条目。我不确定它们在日志中的情况。但我RuntimeException (startEtl):在调用方法中看不到 。
我确定我忽略了一些明显的东西,但我似乎找不到它。
那么为什么调用异常处理没有像我预期的那样工作呢?是因为onStatus在内部以某种方式处理异常吗?
谢谢