Please Enable JavaScript!
Gon[ Enable JavaScript ]

반응형

spring error stacktrace 에러 내용이 찍히지 않을때

[2009-04-25 10:21:11,197](441) Trying to find handler for exception class[java.lang.Exception]

 

에러가 발생하게 되면 보통 stacktrace 의 객체에 저장된 내용을 print 해서 문제를 파악하게 된다.

하지만 spring framework 에서 위와 같이 간단하게 표현되는 경우가 있다.

그 원인을 찾기 위해서 Controller 가 상속받은 클래스를 따라 올라가다 보니

MultiActionController 함수중에 Exception  이 발생할때 실행되는 놈이 있는데 그 함수가

아래와 같다.

 

protected Method getExceptionHandler(Throwable exception){

Class exceptionClass = exception.getClass();

if(logger.isDebugEnabled())

logger.debug("Trying to find handler for exception class [" + exceptionClass.getName() + "]");

       Method handler;

       for(handler = (Method)exceptionHandlerMap.get(exceptionClass);
handler ==
null && !exceptionClass.equals(java.lang.Throwable.class);
handler = (Method)
exceptionHandlerMap.get(exceptionClass))

        {

            if(logger.isDebugEnabled())

                logger.debug("Trying to find handler for exception superclass [" + exceptionClass.getName() + "]");

            exceptionClass = exceptionClass.getSuperclass();

   }

 

   return handler;

}

내용을 보면 대충 알겠지만 logger.isDebugEnabled 일때 Trying to find handler print 하는걸 볼수 있다.
옵션을 어떻게 바꿔야 될지 찾아봐야겠지만
당장은 MultiActionController 상속받아
클래스를 만든후 getExceptionHandler 오버로딩
해서 기능을 변경하는것이 편할것 같다.

방법은 exception 객체에서 StackTraceElement[] 배열을 가져온후 그내용을 StringBuffer

저장하여 log4j 출력하는 절차이다. 문자열을 구성한 로직은 일반적인 에러 출력형태를

취해서 print 한다. 다음은 오버로딩한 함수의 내용이다.

 

protected Method getExceptionHandler(Throwable exception){

   StackTraceElement[] element = exception.getStackTrace();

   StringBuffer errorBuff = new StringBuffer(exception.getMessage());

   errorBuff.append("\n");

   for (int i=0; i < element.length; i++){

      errorBuff.append("\tat ").append(element[i]).append("\n");

   }

   log.debug(errorBuff.toString());

   return super.getExceptionHandler(exception);

}


반응형
Posted by 녹두장군1
,