오류 터질수도 있는곳 예상되는 곳 드래그해서 알트+엔터 trycatch 로 감싸기
트라이+캐치에 +finally로 오류나든 안나든 무조건 실행되는거 추가가능
throw new Exception();
오류 강제로 터트려야될때
RuntimeException(Unchecked Exception)
런타임에 나는 오류(빨간줄 안뜨는거(상황따라 터질수도있고 안터질수도있으니까))
당연히 NullPointerException도 RuntimeException에 속함
CheckedException
컴파일시 나는 오류(빨간줄 뜨는거)
코드작성시에 vscode에서 빨간줄로 표시해주니까 그때만 잡으면 되서 크게 신경 안써도 됨
메서드명에 throws Exception : 나를 호출한 메서드로 떠넘기기(메서드 전체에 트라이캐치문을 건거와 같음)
스프링에선 레파지토리>서비스>컨트롤러>디스패처서블릿으로 넘겨질거임
(디스패쳐서블릿이 클라이언트 요청을 파싱해서 컨트롤러 메서드를 찾아주니까)
메서드 각각마다 throws Exception 안붙혀도,
오류 난곳에서 throw로 넘겼는데 그걸 호출한 메서드에서 처리안하면, 자동으로 또 호출한 메서드로 넘김
(서비스에서 오류인데 컨트롤러에서 아무런 에러관련 처리가 없어도 자동으로 디스패쳐서블릿으로)
throw 키워드는 예외를 직접 생성하여 던지는 데 사용됩니다.
개발자가 직접 예외를 발생시켜야 할 때 사용됩니다.
throw 키워드 다음에는 예외 객체가 올 수 있습니다.
일반적으로 예외 객체의 생성자를 호출하여 예외 객체를 생성하고, throw 키워드를 사용하여 예외를 발생시킵니다.
예시: throw new SomeException("An error occurred");
throws 키워드는 메서드 선언부에서 사용되며, 해당 메서드에서 발생할 수 있는 예외를 명시적으로 선언하는 데 사용됩니다.
메서드가 어떤 종류의 예외를 던질 수 있는지를 사용자에게 알려주는 역할을 합니다.
throws 키워드 뒤에는 메서드에서 던질 예외 클래스를 나열합니다.
여러 예외를 나열할 때는 쉼표로 구분합니다.
예시: public void someMethod() throws IOException, SQLException
throw는 에러를 고의로 발생시킬 때 / 메서드 { } 내부에서 사용
throws는 자신을 호출한 상위 메소드로 에러를 던질때 / 메서드 선언부에서 사용
public void 삭제하기(Integer id) throws Exception {
boardRepository.deleteById(id);
}
메서드명에 throws Exception로 떠넘겨도 되긴 하지만,
코드가 길어지면 어떤 줄에서 어떤 오류가 떴는지 명확하지 않으니까 비추천
public void 삭제하기(Integer id) {
try {
boardRepository.deleteById(id);
} catch (Exception e) {
throw new RuntimeException("없는 게시글 id로 찾음");
}
}
이런식으로 명확하게 해서 나를 호출한 메서드로 떠넘기기
RuntimeException e = new RuntimeException("없는 게시글 id로 찾음");
이게 전달된거와 같음
@RestControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public String error(RuntimeException e) {
return Script.back(e.getMessage());
}
}
디스패처서블릿에 직접 에러처리를 할 수 없으니까
스프링 문법대로 해서 에러관련 만든거
@ControllerAdvice에서 @ExceptionHandler 사용
@ControllerAdvice는 @Controller와 handler에서 발생하는 에러들을 모두 잡아준다.
@ControllerAdvice안에서 @ExceptionHandler를 사용하여 에러를 잡을 수 있다.
https://devlog-wjdrbs96.tistory.com/351