我在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
。偶尔做您正在谈论的事情是适当的,但更多时候是不合适的。
如果您使用的JDK> = 1.4,则可以执行以下操作:
尝试{
//可能引发异常的代码
} catch(IOException e){
抛出新的RuntimeException(e);
} catch(ClassNotFoundException e){
抛出新的RuntimeException(e);
}
并且重新添加的RuntimeException
将包含其原始原因。这样,线程顶部的某个人捕获了RuntimeException
-您的线程确实捕获了RuntimeException
,因此它们不会只是默默地死掉,对吗? -至少可以打印出原因的完整堆栈跟踪。
但是正如其他人已经说过并会说的那样,检查异常是有原因的。仅当确定您的客户端无法从作为非检查异常重新抛出的问题中恢复时,才执行此操作。
注意:如果有可用的话,比RuntimeException
更好的是使用更具体的未经检查的异常。例如,如果您的方法可能引发ClassNotFoundException
的唯一原因是由于缺少配置文件,则可以重新引发MissingResourceException
,这是未经检查的异常,但会提供有关为何引发该异常的更多信息。如果其他RuntimeException
描述了您要抛出的问题,则可以使用的其他好IllegalStateException
是TypeNotPresentException
,UnsupportedOperationException
和ojit_code。
还要注意,对于您的线程来说,捕获RuntimeException并至少对其进行记录总是一个好主意。至少通过这种方式,您了解线程为何消失。