неужели есть только один вариант это обрабатывать с поощью try/catch внутри каждого блока что бы избежать Unhandled exceptions?
Вобщем-то да. Можно вынести try/catch в отдельный универсальный метод, который оборачивает исключение в RuntimeException:
private @NotNull Mono<JsonObject> invoke(Channel channel, Class<?> clazz, Method method, Object... args) {
return Mono.fromCallable(() -> clazz.getDeclaredConstructor(Server.class, Channel.class))
.map(constructor -> ex(() -> constructor.newInstance(this.manager.getServer(), channel)))
.flatMap(obj -> new GenericData<JsonObject>().invoke(method, obj, args))
.onErrorResume(Mono::error);
}
private <T> T ex(Callable<T> code) {
try {
return code.call();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Конкретно в вашем примере можно вызов конструктора переместить в callable, из которого делается Mono, так как из Callable разрешено стрелять проверяемыми исключениями, в отличии от Function, который принимает map:
private @NotNull Mono<JsonObject> invoke(Channel channel, Class<?> clazz, Method method, Object... args) {
return Mono.fromCallable(() -> {
var constructor = clazz.getDeclaredConstructor(Server.class, Channel.class);
return constructor.newInstance(this.manager.getServer(), channel);
})
.flatMap(obj -> new GenericData<JsonObject>().invoke(method, obj, args))
.onErrorResume(Mono::error);
}