gpt4 book ai didi

java - 让特定异常绕过广泛的 catch block 的成语?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:27:55 24 4
gpt4 key购买 nike

通常,在实现模板方法或接口(interface)方法时,只能抛出该方法定义的一种特定类型的异常。但是您的实现可能会为抛出不兼容异常类型或许多不同异常类型的 API 创建类。

自然地,您需要捕获它们并将异常包装到适合已实现方法签名的类型中。假设我们要实现这个接口(interface):

public interface SomeDataGetter {

public long getSomeData() throws IOException;

}

我们的实现使用了一些其他的 API 产品来实现这个,我们调用的 API 方法可能有这个签名:

public long loadFromDBOrCache(Object ... params) throws SQLException, IOException, ObjectNotFoundException, RuntimeException, FridayException, NotWeekendException, NumberIs42Exception;

我编造这个是为了演示您无法按具体类型准确枚举所有可能抛出的异常的情况。请注意,IOException 是我们允许从我们的实现中抛出的类型。

现在我可以在实现这个时走懒惰的路线并包装任何东西以适合我的签名:

@Override
public long getSomeData() throws IOException {
try {
return loadFromDB(...);
} catch (Exception e) {
throw new IOException(e.getMessage(), e);
}
}

这显然会将任何异常包装到一个 IOException(甚至是一个 IOException)中,并且它运行正常。但我想包装 IOExceptions,因为我可以在不包装的情况下抛出它们:

@Override
public long getSomeData() throws IOException {
try {
return loadFromDB(...);
} catch (IOException e) {
throw e;
} catch (Exception e) {
throw new IOException(e.getMessage(), e);
}
}

您可以想象,如果实现中存在多个可能的异常并且允许您从实现中获得多个异常,那么这很快就会变得很麻烦。对于我想要传递的每个异常,我都需要一个额外的捕获。

保持可读性的最佳习惯用法是什么(另外,我很懒,不想写所有这些额外的捕获)并且仍然避免不必要的异常嵌套?或者我不应该打扰而把所有东西都包起来吗?

最佳答案

一种方法是创建一个方法,将所有“禁止的”异常包装在一个允许的异常中,同时返回所有允许的异常,就像这样:

private static void throwIoException(Exception e)
throws IOException // <<= Add other "allowed" exceptions here
{
if (e instanceof IOException) {
throw (IOException)e;
}
... // <<= Add checks for other "allowed" exceptions here
throw new IOException(e.getMessage(), e);
}

现在您可以使用单个 catch block ,并根据需要进行包装:

try {
return loadFromDB(...);
} catch (Exception e) {
throwIoException(e);
}

一个令人不快的结果是堆栈跟踪在新创建的 IOException 的顶部显示实用程序方法,但这并不重要,因为真正的异常是包装异常,而不是 IOException 包装器。如果您捕获的异常恰好是 IOExceptionthe correct stack trace should remain in place .

关于java - 让特定异常绕过广泛的 catch block 的成语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19057340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com