SAP Cloud SDK 中异常的根本原因和传播
Root cause & Propagation of Exception in SAP Cloud SDK
假设我有一个供应商,在调用该供应商的 get 方法时发生了一些异常。
Supplier<> supplier = () -> getSomething();
ResilienceDecorator.executeSupplier( //Edit 1 - Could be ResilienceDecorator.executeCallable
supplier,
resilienceConfiguration,
throwable -> {
log.error("Exception occured", throwable);
return null;
});
编辑 1 - ResilienceDecorator.executeCallable
也一样。
我需要一个一致的 API 来知道执行过程中出了什么问题,即 checked exception (Edit 1 - 或未经检查的异常) 导致失败所以我可以
处理业务逻辑。 throwable 不是异常的根本原因或供应商抛出的任何东西。
如果我们不提供像上面那样的throwable函数那么
每个异常都包含在 ResilienceRuntimeException
中,我们需要一个 getCause().getCause()
链来知道哪里出了问题。这是 sdk 内部的,可能会更改。再次需要一致的 API。
是否有任何替代且一致的方法来了解供应商抛出的异常?我可能需要根据发生的异常将其冒泡或写一条用户友好的消息,具体取决于业务逻辑。
编辑 1-
以我现在的情况为例。
Supplier<MatDocItm> supplier = () -> {
ErpHttpDestination erpHttpDestination = DestinationAccessor.getDestination(S4_SYSTEM).asHttp().decorate(DefaultErpHttpDestination::new);
return new CustomCommand(erpHttpDestination, params).execute();
}
try {
MatDocItm = ResilienceDecorator.executeSupplier(
supplier,
configuration
);
} catch (ResilienceRuntimeException e) {
throw new ReadException("Failed to read from SAP S/4HANA", e);
}
供应商可以抛出运行时异常,基于这些异常,我想提供一条带有适当描述的用户友好错误消息。
如果目标无法访问、配置不正确或不满足某些先决条件,供应商可以抛出 DestinationAccessException
(这是运行时异常)。
不仅供应商发生异常,我还有 TimeLimiterConfiguration
& 如果发生超时,则可以抛出 TimeoutException
。
对于上面的 MatDocItm 示例,ResilienceRuntimeException.getCause()
将给出 com.sap.cloud.sdk.cloudplatform.thread.exception.ThreadContextExecutionException
。 ResilienceRuntimeException.getCause().getCause()
将显示实际导致错误的异常,即 DestinationAccessException
。现在 ThreadContextExecutionException 是 sdk 内部的,并且可以在 sdk 实现更改时更改。此实施细节是否会保持冻结状态并且将来永远不会更改,或者是否有其他方法可以找到根本原因?
我会推荐 ExceptionUtils.throwableOfType
来匹配异常类型和子 classes。
或者 ExceptionUtils.throwableOfThrowable
仅用于匹配精确类型。
实用程序 class 已由依赖项 org.apache.commons:commons-lang3:3.10
提供
示例:
@Nullable
YourException cause = ExceptionUtils.throwableOfType(throwable, YourException.class);
您可以在 If 语句中处理可为 null 的结果。
作为 Fluent API 的粉丝,我宁愿选择 java.util.Optional
或 io.vavr.control.Option
。
假设我有一个供应商,在调用该供应商的 get 方法时发生了一些异常。
Supplier<> supplier = () -> getSomething();
ResilienceDecorator.executeSupplier( //Edit 1 - Could be ResilienceDecorator.executeCallable
supplier,
resilienceConfiguration,
throwable -> {
log.error("Exception occured", throwable);
return null;
});
编辑 1 - ResilienceDecorator.executeCallable
也一样。
我需要一个一致的 API 来知道执行过程中出了什么问题,即 checked exception (Edit 1 - 或未经检查的异常) 导致失败所以我可以
处理业务逻辑。 throwable 不是异常的根本原因或供应商抛出的任何东西。
如果我们不提供像上面那样的throwable函数那么
每个异常都包含在 ResilienceRuntimeException
中,我们需要一个 getCause().getCause()
链来知道哪里出了问题。这是 sdk 内部的,可能会更改。再次需要一致的 API。
是否有任何替代且一致的方法来了解供应商抛出的异常?我可能需要根据发生的异常将其冒泡或写一条用户友好的消息,具体取决于业务逻辑。
编辑 1- 以我现在的情况为例。
Supplier<MatDocItm> supplier = () -> {
ErpHttpDestination erpHttpDestination = DestinationAccessor.getDestination(S4_SYSTEM).asHttp().decorate(DefaultErpHttpDestination::new);
return new CustomCommand(erpHttpDestination, params).execute();
}
try {
MatDocItm = ResilienceDecorator.executeSupplier(
supplier,
configuration
);
} catch (ResilienceRuntimeException e) {
throw new ReadException("Failed to read from SAP S/4HANA", e);
}
供应商可以抛出运行时异常,基于这些异常,我想提供一条带有适当描述的用户友好错误消息。
如果目标无法访问、配置不正确或不满足某些先决条件,供应商可以抛出 DestinationAccessException
(这是运行时异常)。
不仅供应商发生异常,我还有 TimeLimiterConfiguration
& 如果发生超时,则可以抛出 TimeoutException
。
对于上面的 MatDocItm 示例,ResilienceRuntimeException.getCause()
将给出 com.sap.cloud.sdk.cloudplatform.thread.exception.ThreadContextExecutionException
。 ResilienceRuntimeException.getCause().getCause()
将显示实际导致错误的异常,即 DestinationAccessException
。现在 ThreadContextExecutionException 是 sdk 内部的,并且可以在 sdk 实现更改时更改。此实施细节是否会保持冻结状态并且将来永远不会更改,或者是否有其他方法可以找到根本原因?
我会推荐 ExceptionUtils.throwableOfType
来匹配异常类型和子 classes。
或者 ExceptionUtils.throwableOfThrowable
仅用于匹配精确类型。
实用程序 class 已由依赖项 org.apache.commons:commons-lang3:3.10
示例:
@Nullable
YourException cause = ExceptionUtils.throwableOfType(throwable, YourException.class);
您可以在 If 语句中处理可为 null 的结果。
作为 Fluent API 的粉丝,我宁愿选择 java.util.Optional
或 io.vavr.control.Option
。