项目编号6的这个文章指出:
尽量不要因为价格而重新抛出异常.如果重新投掷是必须的,重新抛出相同的异常,而不是创建一个新的异常.这将带来额外的性能.您可以在每个图层中向该例外添加其他信息.
好吧,但这违反了层的分离,不是吗?
假设我有一个抛出SQLException的DAO的特定实现
假设我的服务层(或业务层......)从DAO层调用方法,但决定不处理抛出的异常.
如果我将SQLException重新抛出到视图层,我的视图层将不仅会耦合到DAO层,不是吗?
是不是正确抛出一个新的异常,使查看依赖只有下面一层一层,而不是两个?
抛出相同的Exception会带来什么优势,除了性能?
如果我重新抛出
SQLException
视图层,我的视图层将不仅会耦合到DAO层,不是吗?
这绝对是正确的.
抛出一个新的异常是不对的,所以View只依赖于下面的第一层,而不是两个?
绝对.如果您的DAO层无法处理来自SQL的异常,它应该捕获它,尽可能多地了解它,并抛出它自己的异常.
考虑一个例子:假设您的DAO层允许您添加某个属性必须唯一的新项目.SQL层可能具有唯一约束或唯一索引,以在RDBMS层上强制实施此约束.如果DAO层的调用者尝试保存违反唯一性约束的对象,则会抛出SQL异常.如果你让这个异常传播给调用者,他们可能不知道如何处理它,甚至可能会向最终用户显示:
ORA-00001:违反了唯一约束(UxPatient_rec_soc)
这个解决方案非常糟糕,但尝试在客户端上理解它的替代方案更加脆弱.
您的DAO应该捕获异常,确定它对调用者意味着什么,并抛出自己的异常.这样,您就可以独立于调用者更改您的实现.
一般说明:在决定抛出/重新抛出异常时,性能考虑应该是最不重要的因素,因为异常应该仅在罕见的异常情况下抛出.清晰的界面更为重要.