Acegi(十一):警惕Acegi的Exception的异常处理惩罚
当前位置:以往代写 > JAVA 教程 >Acegi(十一):警惕Acegi的Exception的异常处理惩罚
2019-06-14

Acegi(十一):警惕Acegi的Exception的异常处理惩罚

Acegi(十一):警惕Acegi的Exception的异常处理惩罚

本日改项目中的一个问题时, 不由自住地想到了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,  不要只想着乐成,更要想着失败后的信息的反馈.仿佛大大都环境下, 失败思量的很少.

    关键字:

在线提交作业