Exception 根本原因及;SAP Cloud SDK中异常的传播

Exception 根本原因及;SAP Cloud SDK中异常的传播,exception,sap-cloud-sdk,Exception,Sap Cloud Sdk,假设我有一个供应商,在调用该供应商的get方法时发生了一些异常 Supplier<> supplier = () -> getSomething(); ResilienceDecorator.executeSupplier( //Edit 1 - Could be ResilienceDecorator.executeCallable supplier, resilienceConfiguration,

假设我有一个供应商,在调用该供应商的get方法时发生了一些异常

 Supplier<> supplier = () -> getSomething();
 ResilienceDecorator.executeSupplier( //Edit 1 - Could be ResilienceDecorator.executeCallable
                supplier,
                resilienceConfiguration,
                throwable -> {
                   log.error("Exception occured", throwable);
                   return null;
                });
供应商可以抛出运行时异常,基于这些异常,我想给出一条用户友好的错误消息,并给出正确的描述

如果目标无法访问、未正确配置或未满足某些先决条件,供应商可以抛出
目标访问异常
(这是运行时异常)。 不仅供应商中发生的异常,我还有
TimeLimiterConfiguration
&如果发生超时,则可以抛出
TimeoutException

对于上述MatDocItm示例,
ResilienceRuntimeException.getCause()
将给出
com.sap.cloud.sdk.cloudplatform.thread.exception.ThreadContextExecutionException
<代码>ResilienceRuntimeException.getCause().getCause()将显示实际导致错误的异常,即
DestinationAccessException
。现在ThreadContextExecutionException是sdk内部的,如果sdk实现发生更改,它可以更改。这个实现细节是否会被冻结,将来不会改变,或者是否有其他方法可以找到根本原因?

我建议匹配异常类型和子类。 或者,仅用于匹配精确类型。 dependency
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

您的问题做出了错误的假设。供应商不能抛出任何已检查的异常,因为
供应商
接口没有声明任何已检查的异常。考虑更新你的问题(例如使用<代码> Excel可执行的< /代码>)。不过,总的来说,我建议使用亚历山大在下面指出的方法。对不起,作品。我想我误解了你的问题。您需要原始的非云sdk异常,无论是什么类型。我会理解其中的道理,但我没有直接看到好处?你能给出一个具体的用例吗?(下面的答案还不够吗?)谢谢你的回复@AlexanderDümont。是的,我知道原始的非云sdk例外,将是要求。对我来说,这样做的好处是可以简单地知道到底哪里出了问题,这样我就可以返回一个回退值或做出相应的反应。例如,projectreactor API onErrorReturn方法似乎很方便。话虽如此,我认为下面的答案是好的&足够了,尽管我使用的是3.9版本的lang3。非常感谢,这些实用方法将为我节省大量的开发和测试工作!谢谢你的建议,上面是cherry:)
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);
    }