我在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吗?
有没有更好的方法来做到这一点,或者我是否应该首先尝试这样做?
编辑:
只是为了澄清.这些异常将是致命的,因为配置文件基本上是程序的操作,所有异常都将被捕获并记录在我的程序的顶层.
我的目的是避免不必要的抛出异常,将异常添加到调用我的工厂的每个方法的签名中.
RuntimeException
只有当客户端无法从任何问题中恢复时,才应使用A. 做你正在谈论的事情偶尔是合适的,但更多时候是不合适的.
如果您使用的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
所以他们不会只是默默地死掉,对吧? - 至少可以打印出原因的FULL堆栈跟踪.
但正如其他人所说并会说的那样,例外情况会被检查.只有当您肯定您的客户无法从您作为未经检查的例外重新抛出的问题中恢复时才这样做.
注意:RuntimeException
如果可用的话,更好的是使用更具体的未经检查的异常.例如,如果您的方法抛出a的唯一原因ClassNotFoundException
是因为缺少配置文件,则可以重新抛出a MissingResourceException
,这是一个未经检查的异常,但会提供有关您抛出它的原因的更多信息.RuntimeException
如果他们描述你正在重新抛出的问题,那么使用的其他好处是IllegalStateException
,TypeNotPresentException
和UnsupportedOperationException
.
另请注意,线程始终捕获RuntimeException并且至少记录它总是一个好主意.至少通过这种方式你可以理解为什么你的线程会消失.
这是一个很好的异常处理最佳实践汇编.
从那里得到两点:
调用者代码无法对异常执行任何操作 - >使其成为未经检查的异常
调用者代码将根据异常中的信息采取一些有用的恢复操作 - >使其成为已检查的异常
并且您可以抛出RuntimeException有或没有内部异常,具体取决于调用者可以使用它做什么.如果你没有重新抛出内部异常,那么你应该在你的方法中记录它,如果重要的话.