将已检查的异常包装到Java中未经检查的异常中?

时间:2009-01-27 19:14:19

标签: java exception checked-exceptions

我在java中有这个工厂方法:

public static Properties getConfigFactory() throws ClassNotFoundException, IOException {
    if (config == null) {
        InputStream in = Class.forName(PACKAGE_NAME).getResourceAsStream(CONFIG_PROP);
        config = new Properties();
        config.load(in);
    }
    return config;
}

我想将两个已检查的异常转换为未经检查的异常。最好的方法是什么?

我是否应该捕获异常并使用捕获的异常作为内部异常抛出新的RuntimeException?

有没有更好的方法来做到这一点,或者我是否应该首先尝试这样做?

修改
只是为了澄清。这些异常将是致命的,因为配置文件基本上是程序的操作,所有异常都将被捕获并记录在我程序的顶层。

我的目的是避免不必要的抛出异常,将异常添加到调用我工厂的每个方法的签名中。

4 个答案:

答案 0 :(得分:30)

仅当客户端无法从任何问题中恢复时,才应使用RuntimeException。做你正在谈论的事情偶尔是合适的,但更多时候是不恰当的。

如果您使用的是JDK> = 1.4,那么您可以执行以下操作:

try {
  // Code that might throw an exception
} catch (IOException e) {
  throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
  throw new RuntimeException(e);
}

并且重新招募RuntimeException将包含原始原因。这样,线程顶端有人抓住RuntimeException - 你的线程确实捕获RuntimeException所以它们不会只是默默地死掉,对吧? - 至少可以打印出原因的完整堆栈跟踪。

但正如其他人所说并会说的那样,检查例外是有原因的。只有当你肯定你的客户无法从你作为未经检查的例外重新抛出的问题中恢复时才这样做。

注意:比RuntimeException更好的是使用更具体的未经检查的例外(如果有的话)。例如,如果您的方法抛出ClassNotFoundException的唯一原因是因为缺少配置文件,您可以重新抛出MissingResourceException,这是一个未经检查的异常,但会提供有关您抛出它的原因的更多信息。如果他们描述您要重新抛出的问题,则使用的其他好RuntimeExceptionIllegalStateExceptionTypeNotPresentExceptionUnsupportedOperationException

另请注意,您的线程始终捕获RuntimeException并且至少记录它总是一个好主意。至少通过这种方式你就可以理解为什么你的线程会消失。

答案 1 :(得分:13)

关于异常处理最佳实践的两点:

  • 来电代码无法做任何事情关于例外 - >将其设为未经检查的例外
  • 来电代码将根据异常中的信息采取一些有用的恢复操作 - >将其设为已检查的例外

您可以抛出RuntimeException,有或没有内部异常,具体取决于调用者可以使用它做什么。如果你没有重新抛出内部异常,那么你应该在方法中记录它,如果重要的话。

答案 2 :(得分:4)

你这样做是正确的。

为了让检查的异常通过而不进行检查,您必须将它们包装在未经检查的异常中。

请记住,检查例外是有原因的。

答案 3 :(得分:1)

如果你想避免过多的try - catch es,请抓住工厂本身的两个例外并在那里处理它们。 也许返回默认实现。

来处理异常,这里或其他地方。

由于这是一个工厂,我认为最好在工厂本身(相同的方法或不同的方法)处理这些异常,并返回默认实现。

无论如何,(业务功能)调用者在遇到ClassNotFoundException时不知道该怎么做。