每每想起自己之前所在的一个公司,代码中导出充斥着try-catch、throw 这些代码,就觉得这个公司对不起他自己的名声。
呵呵,后来释然了,好多大公司其实代码都是从无到有的过程,只是后来想重构的时候,却发现工作量巨大,所以就放弃了。可能当时的环境,技术还没有那么纯熟,诸多因素吧,造就了今天我们觉得繁杂的代码。
今天就把自己多年的实践经验和大家分享一下:如何在web应用设计中,少些异常捕获相关代码,多关注业务逻辑。
我们以常见的三层设计为例,action、service、dao,看看如何在三层java代码中规避异常捕获代码。
假设我们的dao中,有一个异常,那我们直接在方法声明中抛出即可
method () throws Exception{
// 有异常的代码
}
我们再service中也不直接处理异常,也是在方法声明中抛出异常即可。
method () throws Exception{
// 有异常的代码
}
我们在action中的调用方法声明中抛出异常即可。
method () throws Exception{
// 有异常的代码
}
好吧,这样一来,是不是在我们的方法体中,没有一行处理异常的代码,这样的方法只关注业务逻辑,是不是一目了然?
好戏还在上演:各层只管抛出异常,那究竟谁来捕获并给客户反馈呢?
这时候,我们可以使用struts2的拦截器了。如果不会拦截器代码,请百度。
拦截器代码中,有一个方法专门关注调用的action方法,我们可以在此方法中,对调用action方法的这个操作进行try=catch捕获,然后判断异常类型。
try{
// 执行action方法
}
catch(Exception e){
// 判断异常类型
if(e instanceOf NullPointerException){
// 根据需要,确定是否给用户提示,或者记录到异常表
}else if(e instanceOf ClassNotFoundException){
// 根据需要,确定是否给用户提示,或者记录到异常表
}else if(e instanceOf ArithmeticException){
// 根据需要,确定是否给用户提示,或者记录到异常表
}
}
总结,上面提到的设计,关键是有一个action的拦截器,每当action的方法执行的时候,拦截器都可以知道,这就是AOP思想。
正式基于struts2提供的拦截器,让我们更好的设计异常处理。
以上是个人经验之谈,大家觉得有不合理的地方,拍砖即可。
1 楼
super8090
2012-11-19
能否说的详细一些,如果使用在拦截器中拦截异常?
2 楼
gds_fighting
2012-11-19
super8090 写道
能否说的详细一些,如果使用在拦截器中拦截异常?
拦截器中不是有一句代码吗?
public String intercept(ActionInvocation invocation) throws Exception
{
invocation.invoke();
}
你改造成
public String intercept(ActionInvocation invocation) throws Exception
{
try{
invocation.invoke();
}catch (Exception e){
if(e instanceOf NullPointerException){
// 自己的逻辑
}
}
}
3 楼
JUnique
2012-11-19
理论分析还是有一定的道理的