java - 将已检查的异常作为 RuntimeException 抛出会导致什么问题?

标签 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;
}

事情是:

  • JSONException 是一个检查异常,但是
  • 我真的不知道如何在编译时处理它。如果 JSONException 真的发生了,它可能是代码中的错误,应该由常规的“全局未捕获异常处理程序”处理,它已经存在(例如 this ),并且已经执行了所有必要的日志记录和清理。

因此,我最终在调用方法中这样做了:

...
try {
    encoded = encodeDataAsJsonString(data);
} catch (JSONException e) {
    throw new RuntimeException(e);
}
...

这似乎比向调用堆栈中的每个 方法添加throws JSONException 更安全。然而,它仍然感觉很脏,因此我的问题是:

如果我希望某些特定的已检查异常进入“常规未检查异常路由”,将其作为 RuntimeException 重新抛出是正确的习惯用法吗?

最佳答案

情况很简单:如果你的异常没有商业值(value),也就是只是一个失败,那肯定是用unchecked exception。如果您需要以特定于该异常的方式处理异常,这在大多数情况下意味着处理代码将涉及业务逻辑,那么使用未经检查的异常仍然可以,但至少有一些好处检查异常。但是,在任何一种情况下,您从 JSON API 获得的原始异常都是无用的,这只是糟糕的公共(public) 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; }

不用说,在项目中使用这种方法时应该非常小心。

关于java - 将已检查的异常作为 RuntimeException 抛出会导致什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13016610/

相关文章:

java - 排序字符串对象

Java在读取文件但同时使用流时避免java.lang.OutOfMemoryError

python - python中的异常

.net - 套接字异常 : No such host is known

Python - 引发异常时发送电子邮件?

c++ - Mysql C++ 驱动程序-创建后获取准备好的语句查询

javax.mail 附加的 PDF 文件已损坏

java - JAVA TripleDES 函数的 PHP 模拟

java - 是否有新版本的 ehcache-core 是最新版本的 Ehcache 的一部分?

c# - 绑定(bind)时已释放 ObjectContext 实例