包装一个检查异常进入一个未经检查的例外在Java?
-
20-08-2019 - |
题
我有这样的工厂的方法在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
应当只用于当客户端无法从任何问题中恢复过来。这是偶尔适当做你在说什么,但更多的时候它是不恰当的。
如果使用的是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
更好的办法是使用更具体的未经检查的异常(如果可用)。例如,如果你的方法可能会抛出一个ClassNotFoundException
的唯一原因是因为配置文件丢失,你可以重新抛出一个MissingResourceException
,这是一个未经检查的异常,但给你为什么扔它的更多信息。其他好的RuntimeException
s如果他们形容你重新抛出这个问题的IllegalStateException
,TypeNotPresentException
和UnsupportedOperationException
使用。
另外请注意,它始终是你的线程赶上RuntimeException的,并至少登录是个好主意。至少这样你明白为什么你的线程会消失。
其他提示
两个点有关的例外处理的最佳做法:
- 呼叫者的代码不能做任何事情 有关异常->使它 未经检查的例外
- 叫码将采取一些有用的恢复行动 基于信息的在例外-->使它 检查异常
你可以扔的异常或不内的例外,取决于什么叫可以做用它。如果你不是重新引发内部异常然后你应该登录在你的方法,如果重要的。
您这样做是正确的做法。
为了让检查的异常,虽然通过,而不被选中,你必须将它们包装在未检查的异常。
记住,例外是用于一个原因进行检查。
如果你想避免过多的try - catch
es,她俩都在工厂本身的异常和处理他们那里。
或许返回一个默认的实现。
您的的的处理例外,在这里或其他地方。
和,因为这是一个工厂,我认为这是更好的是,这些异常都是在工厂本身(同样的方法或不同的方法)处理,并返回一个默认的实现。
反正(业务功能)主叫方将有什么有当它遇到一个ClassNotFoundException
做没有任何线索。