瓦弗的Try.of().getOrElseThrow()
请参阅博客Vavr One Log 03 - 安全尝试:
T getOrElseThrow(供应商)
getOrElseThrow
期望异常提供者作为参数。这可以是 lambda、方法引用或任何函数。其目的是将抛出的异常映射到您的自定义异常实例。例如:
Try.ofCallable(methodWhichThrowsCustomException)
.getOrElseThrow(throwable -> new CustomerException(
HttpStatus.REQUEST_TIMEOUT,
ErrorConstant.ERROR_CODE_REQUEST_TIMEOUT,
ErrorConstant.ERROR_MESSAGE_TIME_OUT,
throwable
))
}
问题
注意:我们使用throwable -> new ..
内括号,仅此而已。异常实例刚刚创建(并隐式返回),我们不抛出它 - 我们将它提供给然后抛出的vavr。
你通过了一个消费者。消费 lambda{ throw new ...; }
立即抛出一个新的异常,而不是简单地用{ return new CustomException("Custom message", thrown); }
.
也可以看看
例外情况TimeLimiter
抛出“methodWhichThrowsCustomException”抛出的异常
假设你有一个方法:
public String sayHelloWorld(boolean shouldThrow) throws CustomException {
if (shouldThrow) throw new CustomException("Hello Exception");
return "Hello World!";
}
你将它传递给TimeLimiter
当它执行并且它无法在时间内成功完成时,它会抛出两个异常之一
- 当超过时间限制时,Resilience4J 会抛出
TimeoutException
:
当发生超时时,它会在抛出TimeoutException
.
- 对于任何其他
ExecutionException
,例如当您的方法引发自定义异常时,它会找到该原因并重新引发此异常。见TimeLimiterImpl
,catch-block,第 57 行。
然后你应该能够抓住它:
try {
// The blocking variant which is basically future.get(timeoutDuration, MILLISECONDS)
String result = timeLimiter.executeFutureSupplier(
() -> CompletableFuture.supplyAsync(() -> sayHelloWorld(true)));
log.info(result);
} catch (Exception e) {
log.error(e); // or print to debug, handle, etc.
}
或使用 Vavr 的Try:
String result = Try.of(() -> timeLimiter.executeFutureSupplier(
() -> CompletableFuture.supplyAsync(() -> sayHelloWorld(true))) // method forced to throw
).getOrElseThrow(throwable -> throwable); // will throw as is (without mapping to another exception)
log.info(result);
也可以看看:
使用 Resilience4j 实现超时 - 反射