2011-11-18 2 views
3

주석이 달린 "@ExceptionHandler"를 사용하여 SpringMVC3에서 "Error"를 catch하고 싶습니다. throwable 및 모든 예외를 catch 할 수 있지만 "오류"로 시도했을 때 예외가 catch되지 않습니다. 왜 그런가? 아래 코드는 문제를 보여줍니다.명시 적으로 throw 된 경우에도 오류가 잡히지 않는 이유는 무엇입니까?

@Controller 
@RequestMapping("/test") 
public class TestExceptionController { 

static final Logger logger = Logger.getLogger(TestExceptionController.class); 

    @RequestMapping(method = RequestMethod.GET) 
    public String processData(int intValue) throws InvalidDataException { 

     if (intValue < 6) { 
      try { 
       throw new Exception(); 
      } catch (Exception e) { 
       throw new InvalidDataException(); 
      } 
     } 

     return "test"; 

    } 

    @ExceptionHandler(InvalidDataException.class) 
    public ModelMap handleException(InvalidDataException ex) { 
     logger.debug("exception catched :" + ex); 

     return new ModelMap(); 

    } 
} 

위의 코드는 catch하지만 아래 코드는 catch하지 않습니다. 왜 오류가 잡히지 않는거야?

@Controller 
@RequestMapping("/test") 
public class TestExceptionController { 

    static final Logger logger = Logger.getLogger(TestExceptionController.class); 

    @RequestMapping(method = RequestMethod.GET) 
    public String processData(int intValue) throws Error{ 

     if (intValue < 6) { 
      try { 
       throw new Exception(); 
      } catch (Exception e) { 

       throw new Error(); 
      } 
     } 
     return "test"; 

    } 

    @ExceptionHandler(Error.class) 
    public ModelMap handleException(Error ex) { 
     logger.debug("exception catched :" + ex); 

     return new ModelMap(); 

    } 
} 
+2

미래에 새로운 질문을 작성하는 대신 기존 질문을 편집하십시오. 나는 원본을 닫는 것을 투표했다. –

+0

어떤 버전의 Spring3을 사용하고 있습니까? – andyb

+0

이 대답을 했습니까? http://stackoverflow.com/questions/8184593/why-error-is-not-getting-caught-even-when-explicitly-thrown/8212177#8212177 –

답변

-2

오류 대신 예외를 처리 할 의도가 없었습니까? 오류는 Java에서 매우 정교하게 사용되고 있으며 구현 클래스가 거의 없습니다. 나를 위해

+0

어설트는 오류. 우리는 다른 것들을 업데이트하지 않고 jar 파일을 변경했을 때 프로덕션 환경에서 몇 가지 클래스 연결 오류를 보았습니다. – Gray

+0

@ 그레이 나는 오류를 처리 할 타당한 사례가 없다는 것을 말하지 않고있다. 나는 그것이 너무 일반적이지 않다는 것이다. 예외적으로 디버그 메시지는 "exception catched"라고하고 Exception 핸들러 메서드는 handleException이라고합니다. 그가 진정으로 Error에 관심이 있다면, 오히려 "오류가 잡히다"고 handleError가 될 것입니다. –

-1

아래 봄과 함께 작동 3.0.5 MVC

@ResponseStatus(HttpStatus.NOT_FOUND) 
public class NotFoundException extends RuntimeException{ 
    public NotFoundException() { 
     super(); 
    } 
} 

@ExceptionHandler 
    @RequestMapping(method = RequestMethod.GET, value = "employee/{id}", 
      headers = "Accept=application/json,application/x-protobuf,application/xml") 
    public @ResponseBody method(xxxx) 
{ 
.. 
throw new NotFoundException 
... 
} 
+0

이것은 어떻게'Error' ('Exception'이 아닌)를 다루는 것과 관련이 있습니까? –

4

사실 나는 봄의 DispatcherServlet의 소스에 보니 오류가 처리 할 수없는 이유는 라인 (809)에 설명

 catch (Exception ex) { 
      Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null); 
      mv = processHandlerException(processedRequest, response, handler, ex); 
      errorView = (mv != null); 
     } 

코드는 Spring 프로세스가 ExceptionResolvers가 주석 또는 Bean 일 수있는 부분입니다. 당신은 Spring이 단지 Throwable이 아닌 Exception을 볼 수 있습니다. Error는 Exception의 하위 클래스가 아니지만 throwable이므로이 방법으로 Spring을 처리 할 수 ​​없습니다. 관련 메모에서 주석은 @ExceptionHandler라고도 불리므로 오류와 함께 작동하지 않을 수도 있습니다.

0

@ peter-szanto가 붙여 넣은 코드에서도 충돌이 발생합니다. Spring 등록 핸들러로 java.lang.Error를 처리 할 수있는 가능성이없는 것으로 보입니다. 내 사용 사례는 지역화 된 페이지에서 오류를 처리하고 오류를 기록하는 것입니다. 제 해결 방법은 정의 된 오류 페이지/오류 코드 500이있는 web.xml과 오류 처리 페이지/위치 인 Spring 처리 컨트롤러 (JSP가 아님)를 사용하여 현지화 작업을 수행하는 것입니다. 단점은 컨트롤러 코드가 실행될 때 현재 사용자에 대한 인증이 없다는 것입니다. 이것은 Spring이 Spring에 매핑되지 않은 잘못된 URI처럼 처리 할 수없는 것들도 잡는다. Error의 javadoc에서

1

:

오류가 심각한 문제를 나타내는 합리적 응용 프로그램이라면 파악하려고 시도해서는 안의 Throwable의 서브 클래스입니다. 대부분 오류는 비정상적인 조건입니다. ThreadDeath 오류는 대부분 응용 프로그램이 catch하려고 시도해서는 안되기 때문에 "normal"조건이지만 Error의 하위 클래스이기도합니다.

오류 (또는 Exception의 하위 클래스가 아닌 다른 Throwable)를 잡는 것은 나쁜 생각입니다. 봄은 그것을지지하지 않음으로써 옳은 일을하고 있습니다.

+1

나는 Spring이 그것을 지원하지 않음으로써 옳은 일을하고 있다고 진술하는 것과 완전히 동의하지 않는다. 언급 된 Javadocs에 따라 * 대부분의 응용 프로그램은 오류 *를 잡아서는 안되지만 ** 실제로 이러한 오류가 잡힐 수있는 합리적인 상황이 ** 있으므로 Spring은 단순히 가장자리 사례를 지원하지 않습니다. ** ** 합리적인 상황에 대한 간단한 예제 **는 이러한 예외에 대한 기본 로깅 **이며, 현재 스프링을 사용하는 것이 불가능하므로 ** 이것을 Spring **의 구조적 결함으로 간주합니다. – Yura

+0

런타임 중에 발생할 수 있고 기록되어야하는'Error'의 또 하나의 예는 다음과 같습니다 ** UnsatisfiedLinkError ** - https://docs.oracle.com/javase/7/docs/api/java/lang/UnsatisfiedLinkError.html, ** ** 런타임에만 감지 될 수 ** ** 적절히 기록 **되어야합니다. 이 오류는 일반적으로 전체 JVM의 충돌을 초래하지는 않지만 동적 라이브러리를 사용하는 기능의 일부에 영향을 미치며 로깅 목적으로 잡아야하는 '오류'와 웹 응용 프로그램이 계속 작동하는 후에 발생하는 '오류'의 완벽한 예입니다 정상적으로. – Yura

관련 문제