управляемый способ обработки исключений в Java - PullRequest
2 голосов
/ 23 августа 2010

Я пытаюсь найти управляемый способ обработки исключений в DAO. Обычно метод в моем DAO выглядит так:

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

Если в приведенном выше коде происходит ошибка, то все записывается в server.log, и на первой странице отображается экран пользовательских ошибок. Тем не менее, я хочу избежать размещения трассировки стека в 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 ]

4 голосов
/ 23 августа 2010

Я думаю, что вы можете использовать АОП здесь.Например:

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

2 голосов
/ 23 августа 2010

Рекомендую добавить несколько методов ведения журнала с помощью Spring AOP . Как показал CoolBeans, вы можете просто воспользоваться советом @AfterThrowing.

2 голосов
/ 23 августа 2010

A ' callback ' решение для обработки исключения и регистрации в одном месте:

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