[英]What issues may ensue by throwing a checked exception as a RuntimeException?
我有一段代码在JSON字符串中编码某种业务数据:
public String encodeDataAsJsonString(Data data) throws JSONException {
JSONObject o = new JSONObject();
o.put("SomeField1", data.getSomeProperty1());
o.put("SomeField2", data.getSomeProperty2());
...
return o;
}
事情是:
因此,我最终在调用方法中执行此操作:
...
try {
encoded = encodeDataAsJsonString(data);
} catch (JSONException e) {
throw new RuntimeException(e);
}
...
throws JSONException
向调用堆栈中的每个方法添加throws JSONException
似乎是一个小恶魔。 但是,它仍然感觉很脏,因此我的问题是:
如果我想要一些特定的检查异常去“常规未经检查的异常路由”,是否将它重新抛出为RuntimeException正确使用的习惯用法?
情况非常简单:如果您的异常没有业务价值,也就是说,它只是一个失败,肯定会使用未经检查的异常。 如果您需要以特定于该异常的方式处理异常,这在大多数情况下意味着处理代码将涉及业务逻辑,那么使用未经检查的异常仍然可以,但使用a时至少有一些好处检查异常。 但是,在任何一种情况下,从JSON API获得的原始异常都是无用的,它只是公共API设计不良的标志。
作为旁注,有“偷偷摸摸”的习惯用法,它可以让你在没有包装的情况下抛出原始的检查异常:
public static <R> R sneakyThrow(Throwable t) {
return UncheckedThrower.<RuntimeException, R>sneakyThrow0(t);
}
@SuppressWarnings("unchecked")
private static <E extends Exception, R> R sneakyThrow0(Throwable t) throws E { throw (E)t; }
不用说,在项目中使用这种方法时应该非常小心。
简短的回答,是的。
您可以创建自己的异常类(运行时异常的子代)并重新抛出它以便更容易记录,在必要时捕获/处理它。 像hibernate这样的东西通过使用HibernateException来实现,客户端/调用代码不会被强制捕获它,但是当可以使用它完成逻辑/特定于应用程序的特定内容时,它总能捕获它。
有一个参数只能在Java代码中使用未经检查的异常。 如果你想遵循这种方法,那么将你检查过的异常包装起来是唯一明智的做法。 FWIW,我多次使用过这种方法,并且它很有用。
即使您不想购买该样式,将一些已检查的异常转换为运行时异常仍然很有用。
我一直这样做。 是的,这是一个很好的方法。 不,这不是一个肮脏的方法。 就个人而言,我无法检查例外情况。 我将所有已检查的异常包装为运行时异常,而不管它是什么类型的异常。
好吧,如果您不打算在应用程序代码中处理异常,那么可以将其作为RuntimeException
抛出。
我更喜欢使用com.google.common.base.Throwables
传播此内容。
检查异常是开发人员之间进行通信的一种方式。 检查过的例外说“处理我”。 如果你知道你做了什么,你可以重新抛出异常(和日志)。
编辑:如在其他答案重写异常也是很好的建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.