何时定义专用例外而不是使用通用例外?

问题描述

我有以下界面:

import org.springframework.batch.core.Job;

public interface LateBindingJobSupplier {
    Job get() throws Exception;
}

SonarLint抱怨我声明它引发Exception而不是定义专用异常。

我可以定义一个自定义的异常类,但是这给接口的用户增加了包装它们生成的异常的负担。

因此,用户不能执行以下操作:

public Step someOtherJobStep(
    StepBuilderFactory steps,Supplier<JobRegistry> jobRegistrySupplier,@Qualifier("someOtherJobParameterExtractor") JobParametersExtractor parametersExtractor
) {
    JobRegistry jobRegistry = jobRegistrySupplier.get();
    return steps.get("mystep")
            .job(new LateBindingJobProxy(()-> jobRegistry.getJob("someOtherJob"))
            .parameterExtractor(parameterExtractor)
    ;
}

他们最终不得不包装可能的异常:

public Step someOtherJobStep(
    StepBuilderFactory steps,@Qualifier("someOtherJobParameterExtractor") JobParametersExtractor parametersExtractor
) {
    JobRegistry jobRegistry = jobRegistrySupplier.get();
    return steps.get("mystep")
            .job(new LateBindingJobProxy(
                    ()-> {
                        try {
                            jobRegistry.getJob("someOtherJob");
                        }
                        catch(NoSuchJobException e) {
                            throw new LateBindingJobSupplierException(e);
                        }
                    }
            )
            .parameterExtractor(parameterExtractor)
    ;
}

第二种方法看起来比较丑陋,我不确定它真的能买到什么。我可以在LateBindingJobProxy类中捕获该异常,并将其包装在那里。

我的分析中有什么要忽略的吗?拥有API的优点和缺点(或者这是SPI?有时,差异对我来说是模糊的),它允许调用者使用通用异常,而不是要求它们将异常包装在特定于API的自定义中

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)