我在C#入门书中读到,如果你不知道如何处理它,你不应该发现异常.在使用
Java编程时考虑到这些建议,我有时会发现我不知道如何处理异常,但我不得不抓住它或“渗透它”以避免编译错误.我宁愿不要在调用树的整个过程中使用throws子句混乱方法,所以我经常使用“转换”异常到RuntimeException,如下所示.将throws子句添加到许多方法中,对于没有真正“处理”(正确处理)的异常,这似乎是冗长和分散注意力的.是以下不好的风格,如果是这样,有什么更好的方法来处理这个?
try { thread.join(); } catch (InterruptedException e) { Console.printwriter.format("%s\n",e.printStackTrace()); throw new RuntimeException(); }
编辑:除了杂乱之外,渗透异常还有另一个问题:在代码修改之后,你可能最终会得到一些不必要的抛出子句.我知道清除它们的唯一方法是通过反复试验:删除它们并查看编译器是否抱怨.显然,如果您想保持代码清洁,这很烦人.
解决方法
在已检查和未检查的异常之间的Java划分是
somewhat controversial.
如果您控制接口,则向签名添加throws子句通常是最好的方法.
如果您处于无法处理异常的情况,但由于检查了异常签名而不允许它冒泡,那么将异常包装到可以重新抛出的异常(通常是RuntimeException)是常见的做法.
在许多情况下,您可能希望使用另一个已检查的异常,例如IOException或sqlException.但这并不总是一种选择.
但在您的示例中,将原始异常包含为“原因”:
throw new RuntimeException(e);
这也可以消除对日志记录的需要(因为这也可以推迟到可以处理异常的人,并且所有信息仍然存在).