处理java中异常的可管理方法

时间:2010-08-23 02:31:18

标签: java spring exception ibatis dao

我正在努力想出一种可管理的方法来处理DAO中的异常。通常,我的DAO中的方法如下所示:

public ArrayList fetchColors (String id)
{
    //call iBatis SqlMapClient
    //put results in a list
    //return list
}

如果上述代码中发生错误,则所有内容都写入server.log,并在首页显示自定义错误屏幕。但是,我想避免将stacktrace放到server.log中,而是将其写入my_app.log(我正在使用log4j)。

所以我打算将上述方法转换为以下方法:

public ArrayList fetchColors (String id) throws SqlException
{
    try {
    //call iBatis SqlMapClient
    //put results in a list
    }
    catch (SqlException e)
    {
      logger.log (e);
      throws e;
    }
    //return list
}

问题:

  • 这是解决问题的最佳方法吗?
  • 我在DAO中有很多方法,并且为每个方法执行上述操作将是一个PITA ..是否有更简单的方法来执行此操作,因此同样的事情适用于DAO中的所有方法?

3 个答案:

答案 0 :(得分:4)

我认为你可以在这里使用AOP。例如:

<bean id="exceptionLogger" class="my.good.ExceptionLogger" />  
<aop:config>
        <aop:pointcut id="allDaoMethods" expression="execution(* my.dao.*(..))" />

        <aop:aspect id="daoLogger" ref="exceptionLogger">
            <aop:after-throwing pointcut-ref="allDaoMethods"
                                method="logIt"
                                throwing="e"/>
        </aop:aspect>  
    </aop:config>

另外作为旁注,你应该总是这样记录,以便在日志文件中看到堆栈跟踪。

  

logger.log(e,e);

答案 1 :(得分:2)

'回调'解决方案,以便处理异常并在一个地方登录:

interface CallBack{
    void invoke();
}

定义一个骨架方法,如:

//Skeleton to handle exception and log in one place 
public void doBusiness(CallBack callBack)  throws SqlException{
    try{
        callBack.invoke();
    }catch(SqlExceptione){
        logger.log (e);
        throws e;
    }
}

称之为:

public ArrayList fetchColors (String id) throws SqlException{
    doBusiness(new CallBack(){

        public void invoke() {
               //call iBatis SqlMapClient
               //put results in a list     
            }        
    });
}

答案 2 :(得分:2)

我建议您添加一些method logging with Spring AOP。正如CoolBeans所示,您可以简单地使用@AfterThrowing建议。