如果未处理,则抛出相同的异常,或构造新的异常?

时间:2015-12-14 19:34:20

标签: java exception

this条款中的第6项:

  

尽量不要因为价格而重新抛出异常。如果   重新投掷是必须的,重新抛出相同的例外,而不是   创建一个新的例外。这将带来额外的性能。您   可以在每个图层中添加该异常的附加信息。

嗯但是这违反了层的分离,不是吗?

假设我有一个特定的DAO实现,它会抛出 SQLException

假设我的服务层(或业务层...)从DAO层调用方法,但决定不处理抛出的异常。

如果我将SQLException重新抛出到视图层,我的视图层将不仅会耦合到DAO层,不是吗?

抛出一个新的异常是不对的,以便View在下面的第一层依次 ,而不是两个?

除了性能之外,抛出相同的Exception会带来什么好处?

2 个答案:

答案 0 :(得分:5)

  

如果我将SQLException重新投射到视图层,我的视图层将不仅会耦合到DAO层,不是吗?

这是绝对正确的。

  

抛出一个新的异常是不对的,所以View只依赖于下面的第一层,而不是两个?

绝对。如果您的DAO层无法处理来自SQL的异常,它应该捕获它,尽可能多地了解它,并抛出它自己的异常。

考虑一个例子:假设您的DAO图层允许您添加某个属性必须唯一的新项目。 SQL层可能具有唯一约束或唯一索引,以在RDBMS层上强制实施此约束。如果DAO层的调用者尝试保存违反唯一性约束的对象,则会抛出SQL异常。如果你让这个异常传播给调用者,很可能他们不知道如何处理它,甚至可能会向最终用户显示:

  

ORA-00001:违反了唯一约束(UxPatient_rec_soc)

这个解决方案非常糟糕,但尝试在客户端上理解它的另一种选择更加脆弱。

您的DAO应该捕获异常,确定它对调用者意味着什么,并抛出自己的异常。这样,您就可以独立于调用者更改您的实现。

一般说明:在决定抛出/重新抛出异常时,性能考虑应该是最不重要的因素,因为只有在极少数情况下才会抛出异常。清晰的界面更为重要。

答案 1 :(得分:3)

我同意你的观点,即在你的图层上添加一个更具描述性的异常包装原始图层会更方便。在这种情况下,SQLException可能是一个低级问题,可以通过抛出一个更具描述性的新异常来解释并放入业务环境。

另外请注意,错误处理本身的性能通常不是您想要优化的。因此,与从方法返回相比,抛出异常的速度较慢,但​​只有在出现问题时才会发生这种情况。 (因为你应该避免使用异常来处理正常的程序流程)

我没有看到抛出相同异常的任何优势,除非您真的无法通过包装来添加任何信息。在那种情况下不要这样做。