快速业务通道

Acegi(十一):借鉴Acegi的Exception的异常处理 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24

Acegi(十一):借鉴Acegi的Exception的异常处理

时间:2009-12-13 javaeye rmn190

今天改项目中的一个问题时, 不由自住地想到了Acegi异常处理. 现在相比项目中的异常处理后, 很是感叹Acegi对异常的处理呀.

先大致回忆下Acegi里的异常处理. 这里说Acegi的异常处理是指围绕ExceptionTranslationFilter展开的, 当然别的地方也有,暂时不做考虑.

Acegi配置中在filterInvocationInterceptor前加了一个 exceptionTranslationFilter, 这样在整个方法调用栈里, exceptionTranslationFilter的doFilter是比filterInvocationInterceptor要低一层的, 而filterInvocationInterceptor的doFilter是很有可能抛出多种异常的, 这些异常即包含Acegi自身的认证时异常和权限不够异常,也包含Serlet规范中可能抛出ServletException或 IOException. 不过filterInvocationInterceptor自身并没有处理任何异常,  不管有什么异常都采取顺其自然的方式,而且它自己还抛出了AuthenticationException和AccessDeniedException 两个异常.

异常由谁处理呢? 交给exceptionTranslationFilter来处理, 顾名思义, 这个Filter的本职工作就是来处理异常这些麻烦事的. 看源码, 我们知道, 这个filter除了异常处理外什么事都不做. 由handleException这个方法来专门跟来自filterInvocationInterceptor的异常打交道.

这样做有什么好处? 好处大大的, 解耦合, "冲锋陷阵"的"冲锋陷阵",做"后勤"的做"后勤", 大家各司其职,有条不紊, 这样两方都能发挥出最大作用.最终的整体作战效果也会出奇地好.

再看项目中的一个小例子, 看如下代码:

Java代码

protected String sendAlertMessage(String to,String subject,String msg,String from) { SimpleMailMessage mailMessage = createMessage(to,subject, msg,from); try{ mailEngine.sendEmail(mailMessage); } catch(MailException ex) { log.error(ex.getMessage()); return ex.getMessage(); } return "1"; }

这段代码是用来发邮件的, 我们看下这里的异常处理. mailEngine的sendEmail会抛出异常的, 看了下文档它的抛出的异常为MailException, 而MailException有四个子类: MailAuthenticationException,MailParseException,MailPreparationException, MailSendException.而这里都给catch住了, 只把异常的message以String类型返回, 这样sendAlertMessage方法的调用者要想知道是邮件发送失败的原因就得烦些周折了. 本来MailException及其子类有很丰富的异常信息, 但由于sendAlertMessage方法的越俎代庖,画蛇添足了.

现在假设这样一种情况, 程序要发邮件, 可收件人的地址不存在, 系统要求把报错信息反馈给终端用户, 即显示信息"由AAA发送给BBB的邮件,由于BBB的email不存在而发送失败", 这里为了更友好地显示, AAA用的是Ta的真名,而没有用Ta的邮件地址. 为了显示这样的报错信息, 调用sendAlertMessage就麻烦大了,因为这里是没有AAA的真名的.

于是我们想,能不能像Acegi里处理异常那样用一个单独的方法来做呢?  这样的设计显然是行的通的.

-----------后记-------------

1, 初学Java时, 知道OOP时异常处理的优势. 可项目中或自己写代码时,很少能全局地考虑异常处理, 大多情况下,发现IDE里显示有异常没处理了,想也没多想地给catch住了, 现在看来,异常处理时学问不小.

2, 这篇也是钻研Acegi以来,除Security方面外,感觉对自己面向对象帮助最大也最明显的一次, 也让自己小小窃喜了下.

3, 其实是昨天发现项目中sendAlertMessage方法的不妙的, 当时也想写下来, 可老是理不出思路来. 今天做完头给安排的工作后,趁着情绪高涨,再回头看这个问题时, 一下就想到Acegi时的异常处理. 于是有了这篇还算说得过去的记录. 头脑要清醒,否则要放一放了. 遇到问题,不要急也不要气馁, 办法总是有的, 静下心一遍两遍地去看,会有线索的. 呵呵, 有点想小学生作文.

4,  不要只想着成功,更要想着失败后的信息的反馈.好像大多数情况下, 失败考虑的很少.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号