将未经检查的异常包装到Java中的已检查异常中

时间:2014-02-10 21:34:29

标签: java exception

我正在阅读别人写的代码。未经检查的异常和已检查的异常都是自定义异常。我看到在方法中抛出了一个未经检查的异常,它被包装到catch子句中的checked异常中并再次抛出。将未经检查的异常包装到已检查的异常中是一种常见做法吗?如果是的话,为什么我们这样做?

2 个答案:

答案 0 :(得分:3)

自定义未经检查的例外是"leaky abstractions."

的罪魁祸首

应用程序可能会为其所依赖的服务定义接口。如果实现抛出应用程序要特定处理的特定于实现的未经检查的异常,则它会受到特定于实现的异常类型的污染。如果更换实现,这会导致维护问题。

为避免此问题,未经检查的异常可能会包含在接口定义的实现中性检查异常中。

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

答案 1 :(得分:1)

如果你在方法meth中这样做,可能是因为代码调用了
meth只需了解并检查已检查的例外情况 假如meth可以抛出5种不同类型的未经检查的例外,
你使这个更统一,并允许调用代码只担心 关于已检查的。但是你当然可以使用未经检查的例外 这个包装也是如此。只是编译器无法执行 帮助你调用代码。