Dao层的错误如何返回给页面?

提交数据 -> Struts Action -> 选择一个Service -> DAO处理 ,DAO处理的错误,例如“密码不正确” 怎么返回给 Action ?

可以抛出异常到上一层,再由上一层处理!
[该贴被codeslave于2008-02-25 09:43修改过]

恩,我也想到用异常试试。看过天乙社区代码,发现他很多业务都在action处理,错误就直接addActionMessage了。jivejdon的代码没有使用struts action。谢谢楼上回答。

>他很多业务都在action处理
这是违反基本分层架构设计的,业务应该在业务层,Action属于控制层 ,属于界面层MVC的Controller

>jivejdon的代码没有使用Struts action
其实内部通过Jdon框架使用了,只不过不用程序员自己写action

看了几个系统的代码,dlog4j,天乙社区算是国人搞的分层比较好的系统了。但是结构非常走样,dlog4j把所有业务写入了DAO,天乙就是Struts Action无比庞大。有时看jivejdon那么一点点代码都不知道是谁对谁错。有了两位的指点,我更坚定自己判断正确的了。但是为什么我这个初学者都看出的破绽前面2个系统的人都不清楚呢。

个人认为:“密码不正确”不属于DAO异常,而属于业务异常,DAO是数据访问的抽象层,因此,只有数据访问的错误才在DAO抛出,例如:数据库连接断开,ID找不到对应的数据等“Unchecked Exception”

因此,判断用户密码是否正确的逻辑应该在Sevice层做:


public UserManagementServiceImpl implements UserManagementService {

public void login(String loginName,String password) throws ServiceException {
UserDO userDO = userDAO.getUserByLoginName(loginName);
if(userDO==null)
throw new ServiceException("User doesn't exist!");
if(!userDO.getPassword().equals(encode(password)))
throw new ServiceException("Password is wrong!");
}
}

我也遇到过类似问题,当时我给Service定义了2种异常,ServiceException和SystemException。分别对应业务和系统不可控异常。
不过直到现在我都感觉,比如密码输入错误能算Exception吗?
我总感觉只能算是Service的一种return值!
可能是我理解的问题?

如果返回信息只能两种: 登陆成功/登陆失败,就可以在登陆失败的时候直接返回false

但如果登陆失败的多种原因需要进行分类反馈给客户,例如:
用户不存在
密码错误
用户被锁定
系统关闭
...

就不能只通过返回值来告诉客户了,这种情况,就需要用Exception类处理,而且需要抛出一种非RuntimeException,让调用者根据实际情况进行处理。

在设计系统的时候,可能一开始的需求只有“能/不能”两种情况,但以后系统的需求是有扩展的可能的,比如以后用户可以被锁定,需要告诉客户更丰富的登陆失败信息,所以,设计LogIn服务接口的时候,就需要进行充分考虑,以适应日后的变化,这样设计出来的接口,才符合OCP(开闭原则)。