gpt4 book ai didi

java - 来自组件的包装异常

转载 作者:行者123 更新时间:2023-12-02 00:56:09 28 4
gpt4 key购买 nike

有一种类型的异常系统,其中组件抛出特定于组件的异常。例如,所有数据访问类都会抛出 DataAccessException

在这种风格中,我经常发现自己必须捕获并重新抛出组件特定的异常,因为被调用的方法被声明为 throws Exception:

try {
int foo = foo();
if (foo != expectedValue) {
throw new ComponentException("bad result from foo(): " + foo);
}
bar();
}
catch (ComponentException e) {
throw e;
}
catch (Exception e) {
throw new ComponentException(e);
}

你发现自己也在做同样的事情吗?你觉得丑吗?

这个问题不是关于这种风格的有效性,而是关于这种风格的约束范围内的事情。

最佳答案

这太丑了。我认为对于这种丑陋的风格没有更多的评论。如果您已经拥有使用原因处理不同问题的所有代码,那就可以了。只是使用

try {
componentCall();
} catch (ComponentException e) {
Throwable t = e.getCause();
//Handle each possible cause
}

与其他方式相比,可维护性较差且更令人困惑,主要的一点是我认为使用它没有任何优势。

鉴于您仅限于使用它,我至少会尝试避免有原因和无原因抛出 ComponentException,这会使其比需要的更加困惑,在您的示例中,我会添加一个 InvalidFooException并将其添加为通用 ComponentException 的原因。

try {
int foo = foo();
if (foo != expectedValue) {
throw new InvalidFooException("bad result from foo(): " + foo);
}
bar();
}
catch (Exception e) {
throw new ComponentException(e);
}

getCause()适用于chains of exceptions只是因果关系而不是语义相关。

如果您需要它们来区分不同的异常(例如,应通过与 AccessDeniedException 不同的操作来纠正 SQLExecutionException),那么您的方法不适用(因为在每个 catch 中强制使用 getCause() 来查看发生了什么需要完成的事情非常糟糕,并且除了在前面捕获正确的异常之外没有任何好处)。

如果所有调用类必须做的就是报告错误并取消,那么包装可能没问题,但我不会这样做,因为它没有增加什么好处,如果您以后需要区分,将使您重写很多的东西。

有用的是创建一个 hierarchy of exceptions对于相同类型的异常,在以下行中:

如果 DataAccessException 是根,那么您可以有 DataSourceUnavailableException、InvalidDataSourceException、InvalidDataException,然后您可以决定仅捕获父级(如果操作相同)或单独捕获每个异常。

顺便问一下,为什么你需要这样做?

关于java - 来自组件的包装异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/207608/

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