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

java中处理异常的可管理方法,java,spring,exception,ibatis,dao,Java,Spring,Exception,Ibatis,Dao,我试图找到一种可管理的方法来处理DAO中的异常。我的DAO中的方法通常如下所示: public ArrayList fetchColors (String id) { //call iBatis SqlMapClient //put results in a list //return list } 如果上述代码中发生错误,则所有内容都将写入服务器.log,并在首页显示自定义错误屏幕。但是,我希望避免将stacktrace放在server.log中,而是将其写入my_a

我试图找到一种可管理的方法来处理DAO中的异常。我的DAO中的方法通常如下所示:

public ArrayList fetchColors (String id)
{
    //call iBatis SqlMapClient
    //put results in a list
    //return list
}
如果上述代码中发生错误,则所有内容都将写入服务器.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中的所有方法
A'回调'解决方案,以便在一个位置处理异常和日志:

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     
            }        
    });
}

我想你可以在这里使用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)


我建议你加一些。正如CoolBeans所展示的,您可以简单地使用@afterhrowing建议。

在我看来,这是最好的方法。Java只是一种非常冗长的语言。