当调用者对每个异常句柄应用相同的操作时捕获非特定的异常

时间:2010-12-19 23:03:32

标签: java exception-handling

我必须根据运行时配置动态实例化某个类。所以,我需要调用方法 newInstance()并相应地处理异常:

try {
    clazz.newInstance();
} catch (InstantiationException ex) {
    logger.error(ex, ex);
    throw new RuntimeException(ex);
} catch (IllegalAccessException e) {
    logger.error(ex, ex);
    throw new RuntimeException(ex);
}

在我的代码的这一点上,处理此异常的唯一方法是尝试记录错误并向用户呈现友好消息(将异常重新抛出为运行时,视图层将 捕获运行时异常)

<exception class="java.lang.Exception">
  <redirect view-id="/error.xhtml" />
</exception>

关键是,如果在调用方法 newInstance()时无法合理地恢复任何异常抛出的错误,并且对于每个异常都应用相同的操作(记录并重新抛出异常) ,是一种更好的方法来替换处理非特定异常的代码,如:

try {
    clazz.newInstance();
} catch (Exception ex) {
    logger.error(ex, ex);
    throw new RuntimeException(ex);
}

2 个答案:

答案 0 :(得分:4)

不幸的是,这是Java的限制。我相信Java 7可以解决这个问题。

然而,在此之前,你会遇到两个令人不快的选择:

  1. 抓住每个例外并剪切并粘贴该行为。
  2. 抓住Exception并写一次行为。
  3. 我个人更喜欢1.他们都很讨厌,但是至少在1岁时,当你SomeCrazyException被抛到某个地方时,你不会发生奇怪的事情。

答案 1 :(得分:0)

我发现这篇关于泛型异常Beware the dangers of generic Exceptions的好文章。作者解释了几个原因,以避免处理泛型异常(除了少数例外) 。一般而言,我认为这些是相关的观点:

  • 泛型catch(Exception e)捕获 RuntimeException 的所有子类。并且根据运行时异常指示编程错误并且不期望恢复那些错误。

  • 如果您的代码只捕获Exception,您可能永远不会知道稍后调用的方法是否会在其方法签名中添加新的已检查异常。

  • 来电者可以从某些错误中恢复,但不能从其他错误中恢复。

  • 记录受到限制,因为只有一个catch子句不知道被捕获的特定异常。