java - 将已检查异常的*原因*重新抛出为未检查异常有什么缺点吗?
问题描述
我正在编写一个库,在其中我在内部使用检查的异常,因为它有助于确保所有路径都处理某些异常情况。但是,由于我使用了以下规则,我不想给我的图书馆用户带来这些检查异常的负担:
只有在调用者和接收者都无法控制的情况下,才应检查异常。
由于大多数内部检查异常都指向配置问题或其他在正确设置中永远不会发生的问题(因此可以由用户解决),因此我希望在我的 API 边界处将这些作为未经检查的异常公开。
通常,我会将这些检查的异常包装在未经检查的变体中并完成它。但是,在这个库中,我有时已经有 3 级异常嵌套,例如:
hs.ddif.core.inject.instantiator.CheckedInstantiationException: Exception while constructing instance via Producer: hs.ddif.core.inject.instantiator.InstantiatorTest$H hs.ddif.core.inject.instantiator.InstantiatorTest$B.createH()
(...)
Caused by: java.lang.reflect.InvocationTargetException
(...)
Caused by: java.lang.RuntimeException: can't create H
在顶部添加另一个级别(这不会真正添加任何相关信息)使得更难看到根本原因,并且需要instanceof
检查getCause
用户代码是否确实想要进行特定处理。我目前这样做:
catch(CheckedInstantiationException e) {
throw new InstantiationException(e); // convert to runtime at API boundary
}
但是,如果我这样做了怎么办:
catch(CheckedInstantiationException e) {
throw new InstantiationException(e.getMessage(), e.getCause()); // convert to runtime at API boundary
}
这会剥离一个嵌套级别,但会保持跟踪完整。跟踪看起来略有不同,但仍包括所有涉及的行。
我的问题是,这种方法是否有我遗漏的缺点?
解决方案
推荐阅读
- reactjs - 重新渲染无法使用 immer 更新应用程序状态
- gradle - 下载依赖项jar时,如何下载其依赖项
- python - 防止 TabbedPanel 在动画期间重绘
- sql - 特殊字符 - Sql
- android - Flutter & AndroidX 不兼容如何手动设置依赖
- apache-kafka - Windows 上的 Kafka Connect for Oracle 设置
- python - 为什么我的代码运行相同的列表,即使它甚至没有被使用?
- angular - Rxjs - 带有按钮的表格,在请求之前按下最后一个按钮后等待一段时间
- azure - Azure 事件中心限制及其与纯 Kafka 群集的比较
- html - 在鼠标单击事件期间执行不需要的组件方法