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

我在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; } 

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

我应该捕获exception并使用捕获的exception作为内部exception抛出一个新的RuntimeException吗?

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

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

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

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

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

尝试{
   //可能引发exception的代码
 } catch(IOException e){
  抛出新的RuntimeException(e);
 } catch(ClassNotFoundException e){
  抛出新的RuntimeException(e);
 }

并且重新RuntimeException将包含其中的原始原因。 这样,线程顶端有人捕获RuntimeException – 你的线程会捕获RuntimeException所以它们不会只是默默地死掉,对吧? – 至少可以打印出原因的FULL堆栈跟踪。

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

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

另请注意,您的线程始终捕获RuntimeException并且至少记录它是一个好主意。 至少这样你就能理解为什么你的线程会消失。

这是一个很好的exception处理最佳实践汇编。

从那里得到两点:

  • 调用者代码无法对exception执行任何操作 – >使其成为未经检查的exception
  • 调用者代码将根据exception中的信息采取一些有用的恢复操作 – >使其成为已检查的exception

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

你这样做是正确的。

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

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

如果你想避免太多try - catch es,请捕获工厂本身的exception并在那里处理它们。 也许返回默认实现。

必须在此处或其他地方处理exception。

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

无论如何,(业务函数)调用者将不知道遇到ClassNotFoundException时必须做什么。