@ExceptionHandler(부모예외.class) public String 부모예외처리(부모예외 e) { } @ExceptionHandler(자식.class) public String 자식예외처리(자식예외 e) { }
@ExceptionHandler에 지정된 부모클래스는 자식 클래스까지 처리할수 있다.
따라서 자식 예외가 발생하면 부모예외처리(), 자식예외처리() 둘다 호출 대상이된다. 그런데 둘중 더 자세한 것이 우선권을 가지므로 자식예외처리()가 호출된다.
@ExceptionHandler({AException.Class, BException.class) public String ex(Exception e) { log.info("exception", e); }
다음과 같이 다양한 예외를 한번에 처리할 수 있다.
@ExceptionHandler public ResponseEntity<ErrorResult> userExHandler(UserException e){ log.error("[exceptionHandler", e); ErrorResult errorResult = new ErrorResult("user-ex", e.getMessage()); return new ResponseEntity(errorReuslt, HttpStatus.BAD_REQUEST) }
메서드의 파라미터에 예외가 지정된다.
@ResponseStatus(HttpStatus.BAD_REQUEST) //처리가 완료되면 200인데 오류를 지정 @ExceptionHandler(IllegalArgumentException.class) public ErrorResult illeagalExHandler(IllegalArgumentException e){ log.error("[ExceptionHandler ex", e); return new ErrorResult("Bad", e.getMessage()); }
- 컨트롤러를 호출한 경과 IllegalArgumentException 예외가 컨트롤러 밖으로 던져진다.
- 예외가 발생으므로 ExceptionResolver가 작동한다. 가장 우선순위가 높은 ExceptionHandlerExceptionResolver가 실행된다.
- ExceptionHandlerExceptionResolver는 해당 컨트롤러에 IllegalArgumentException을 처리할 수 있는
@ExceptionHandler가 있는지 확인한다.- IllegalExHandel()실행한다 @RestController이므로 IllegalExHandler에도 @ResponseBody가 적용된다. 따라서 HTTP 컨버터가 사용되고 응답이 다음과 같은 JSON 을 반환된다.
- @ResoponseStatus(HttpStatus.BAD_REQUEST)를 지정 했으므로 HTTP 상태코드 400으로 응답된다.
json
{
"code" : "BAD",
"message":"잘못된 입력"
}