2010-08-23 4 views
2

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

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?
+0

Кажется, что это лучший способ сделать это. Java - это очень подробный язык. – Mike

ответ

2

A 'обратного вызова' решение для того, чтобы обработать исключение и войти в одном месте:

interface CallBack{ 
    void invoke(); 
} 

Define скелет метод, как:

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

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

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