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.ThreadContextExecutionExceptionResilienceRuntimeException.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.Optionalio.vavr.control.Option