Hei*_*nzi 4 java exception-handling
我有一段代码在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到每一个方法调用堆栈.但是,它仍然感觉很脏,因此我的问题是:
如果我想要一些特定的检查异常去"常规未经检查的异常路由",是否将它重新抛出为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 来完成,客户端/调用代码不会被强制捕获它,但是当可以用它完成一些逻辑/特定于应用程序的事情时,它总是可以捕获它。
| 归档时间: | 
 | 
| 查看次数: | 663 次 | 
| 最近记录: |