当前位置: 代码迷 >> Web前端 >> web应用设计之错误处理
  详细解决方案

web应用设计之错误处理

热度:107   发布时间:2012-12-21 12:03:49.0
web应用设计之异常处理
    每每想起自己之前所在的一个公司,代码中导出充斥着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  
理论分析还是有一定的道理的