public String main1() throws Exception{
try {
throw new Exception("예외가 발생했습니다.")
}
catch(Exception e) {
return "error";
}
}
@ExceptionHandler(Exception.class)
public String catcher(Exception ex,Model m) {
m.addAttribute("ex",ex);
return "error";
}
예외처리를 하는 클래스를 생성한 후,
ControllerAdvice annotation을 선언하여 전역으로 관리할 수 있다.
@ControllerAdvice("패키지명") //지정된 패키지에서 발생한 예외만 처리
//@ControllerAdvice //모든 패키지에 적용
public class GlobalCatcher {
@ExceptionHandler(Exception.class)
public String catcher(Exception ex,Model m) {
m.addAttribute("ex",ex);
return "error";
}
@ExceptionHandler({NullPointerException.class,FileNotFoundException.class})
public String catcher2(Exception ex,Model m) {
m.addAttribute("ex",ex);
return "error";
}
}
예외 처리 메서드가 중복된 경우, 컨트롤러 내의 예외 처리 메서드가 우선
서버가 매끄럽게 예외를 처리해도 결국 사용자가 원하는 요청을 수행하지 못 한 상황이다. 하지만 서버는 서버에서 처리한 대로 응답했기 때문에 200으로 응답한다.
서버는 default로 500을 뿜는데, ResponseStatus annotation을 사용하면, 원하는 응답 상태로 변경할 수 있다.
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 200 -> 500으로
public String catcher(Exception ex,Model m) {
m.addAttribute("ex",ex);
return "error";
}
web.xml에 아래와 같은 코드를 추가하여, 응답 상태별로 보여줄 jsp와 자동으로 연결할 수 있다.
<error-page>
<error-code>400</error-code>
<location>/error400.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error500.jsp</location>
</error-page>