컨트롤러 내의 메서드에서 발생한 예외를 처리하는 메서드를 작성하고 @ExceptionHandler 어노테이션을 앞에 붙인다. 메서드 자체가 하나의 캐치블락이라고 생각!
@ExceptionHandler(Exception.class) // 만약 여러개의 예외를 처리하기 위해서는
//예외를 배열로 넣어주면 된다.
public String catcher(Exception ex, Model m) {
m.addAttribute("ex",ex);
return "error";
}
<%@page isErrorPage="true"%>
를 추가해주면 모델을 이용해 예외를 전달하지 않아도 된다.@ExceptionHandler는 같은 컨트롤러 내부에 있는 메서드에 한해서만 예외를 처리
-> @ControllerAdvice로 전역 예외 처리 클래스를 작성할 수 있다
@ControllerAdvice("com.fastcampus.ch2") //해당 패키지에서 발생한 예외만 처리
//@ControllerAdvice //모든 패키지에 적용
public class GlobalCatcher {
@ExceptionHandler(Exception.class)
public String catcher(Exception ex, Model m) {
m.addAttribute("ex",ex);
return "error";
}
}
예외처리 메서드를 사용했을때 요청에 대한 응답코드는 200 (요청 처리 성공) -> 요청과정에서 에러가 발생했으니 응답코드도 바꿔주어야된다. 이때 사용되는것이 @ResponseStatus 어노테이션
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) //405 Method Not Allowed.
@ExceptionHandler(Exception.class)
public String catcher(Exception ex, Model m) {
m.addAttribute("ex",ex);
return "error";
}
@ResponseStatus(HttpStatus.BAD_REQUEST) //400 Bad Reqeust.
class MyException extends RuntimeException {
...
}
예외 종류별 뷰 매핑에 사용
<beans:bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<beans:property name="defaultErrorView" value="error"/>
<beans:property name="exceptionMappings">
<beans:props>
<beans:prop key="com.fastcampus.ch2.MyException">error400</beans:prop> //예외 종류에 따라 뷰를 매핑
</beans:props>
</beans:property>
<beans:property name="statusCodes">
<beans:props>
<beans:prop key="error400">400</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
응답 상태 코드 별로 뷰를 지정
<error-page>
<error-code>400</error-code>
<location>/error400.jsp</location>
</error-page>
//이런식으로 여러개 설정 가능