繁体   English   中英

在Java中将未检查的异常包装为已检查的异常

[英]Wrapping an unchecked exception into a checked exception in Java

我正在阅读别人编写的代码。 未检查的异常和检查的异常都是自定义异常。 我看到一个未检查的异常被抛出到一个方法内部,并且被包裹在一个catch子句中的被检查的异常中,并再次被抛出。 通常将未检查的异常包装到已检查的异常中吗? 如果是,我们为什么要这样做?

定制未检查的异常是“泄漏抽象”的元凶

应用程序可能为其依赖的服务定义接口。 如果实现抛出了应用程序要特定处理的,特定于实现的未检查异常,则它会被特定于实现的异常类型污染。 如果替换实现,这将导致维护麻烦。

为避免此问题,可以将未检查的异常包装在接口定义的与实现无关的已检查异常中。

作为一个具体的例子,考虑一下Hibernate使用未经检查的异常来通知调用者约束违例。 假设您有一个User实体,并且用户名在数据库中定义了唯一约束。 您想通过提示用户输入其他名称来专门处理这种情况。 如果Hibernate的ConstraintViolationException沿堆栈ConstraintViolationException传播,则应用程序将需要特定于Hibernate的处理程序。 另一方面,如果数据访问层将其包装在合适的自定义检查异常中,则用新的ORM实现替换Hibernate不需要对实现层进行任何更改。

如果您在方法meth此操作,则可能是因为代码调用
meth只需知道并检查已检查的异常。
假设meth可以抛出5种不同类型的未经检查的异常,
您可以使这一点更加统一,并允许调用代码只担心
关于检查的。 但是当然可以使用未经检查的异常
也要包装 只是编译器将无法
在调用代码方面有很大帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM