spring error stacktrace 에러 내용이 찍히지 않을때
[
에러가 발생하게 되면 보통 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);
'안드로이드' 카테고리의 다른 글
Telephony 기능 (0) | 2011.01.27 |
---|---|
멀티 터치 구현 예제 (0) | 2011.01.27 |
java.lang.Annotation(주석:@) (0) | 2011.01.27 |
View Fipper (0) | 2011.01.27 |
상태바(Status Bar) (0) | 2011.01.27 |