首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自组件的封装异常

来自组件的封装异常
EN

Stack Overflow用户
提问于 2008-10-16 06:41:45
回答 2查看 282关注 0票数 0

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

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

代码语言:javascript
复制
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); 
}

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

这个问题不是关于这种风格的有效性,而是在这种风格的约束下的东西。

EN

回答 2

Stack Overflow用户

发布于 2008-10-16 06:58:34

像地狱一样丑陋。我想,对于这种丑陋的风格,没有什么可评论的了。如果你已经有了使用原因来处理不同问题的所有代码,那就行了。它只是在使用

代码语言:javascript
复制
try {
  componentCall();
} catch (ComponentException e) {
  Throwable t = e.getCause();
  //Handle each possible cause
}

与其他方式相比,它的可维护性较差,也更令人困惑,主要的一点是我看不出使用它有什么好处。

考虑到您只能使用它,我至少会尽量避免抛出有原因和没有原因的ComponentException,这会使它比需要的更加混乱,在您的示例中,我将添加一个InvalidFooException,并将其添加为泛型ComponentException的原因。

代码语言:javascript
复制
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,然后你可以决定只捕获父级中的任何一个(如果操作相同),或者单独捕获每个异常。

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

票数 3
EN

Stack Overflow用户

发布于 2008-10-16 08:49:48

这样做可能不那么难看(如果foo()函数是声明抛出异常的函数):

代码语言:javascript
复制
int foo;
try {
    foo = foo();
}
catch (Exception e) { 
    throw new ComponentException(e); 
}
if (foo != expectedValue) {
    throw new ComponentException("bad result from foo(): " + foo);
}
bar();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/207608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档