ExceptionHandler

dalBeen·2023년 10월 6일
0

스프링

목록 보기
7/14

프로그램에서 발생할 수 있는 에러

1. 컴파일 에러

  • 컴파일러가 에러를 발견하면 IDE에 알려줌(프로그램 실행전)

2. 런타임 에러

  • 컴파일러가 아무런 에러를 발생시키지 않고 런타임에 프로그램 실행 중 발생하여 동작을 멈춤

3. 로직 에러

  • 프로그래머의 탓

런타임 에러

런타임에러는 errors와 exceptions로 나뉜다


1. Errors

  • 회복 될 수 없고 프로그램은 멈춰야한다
  • ex) out of memory, stack overflow

2. Exceptions

  • 에러는 회복될 수 있다
  • 프로그래머는 예외가 발생했을 때 이 예외들을 관리할 수 있는 핸들러를 구현할 수 있음
  • ex)NullPointerException, CastException

Exceptions는 RuntimeException과 다른 예외클래스로 나뉨

  • RuntimeException : 실행 중 발생하는 예외이지만, 코딩할 때 처리할 필요는 없다.
    • 0으로 나누기, class cast 등
  • 다른 Exception : 미리 예외상황을 어떻게 처리할 지 정해야한다.
    • FileNotFoundException, ClassNotFoundException...


Exception Handling : try - catch

public class example {
	public static void main(String[] args) {
		int number = 100;
		int result = 0;
		for (int i = 0; i < 10; i++) {
			try {
				result = number / (int) (Math.random() * 10);
				System.out.println(result);
			} catch (ArithmeticException e) {
				System.out.println("0");
			}
		}
	}
}

Exception, ExceptionHandler 만들기

1. 일단 Exception을 알려주는 응답 객체를 만들기

@Data
@Builder
public class ErrorResponse {
    private int code;
    private String message;
}

2. 만들 Exception에 바로 RuntimeException을 상속해도 되지만 추상클래스 만들어서 공통적인 메서드 상속받게 하기

public abstract class AbstractException extends RuntimeException{
    abstract public int getStatusCode();
    abstract public String getMessage();
}

3. Exception 만들기

public class TestException extends AbstractException {

    @Override
    public int getStatusCode() {
        return HttpStatus.BAD_REQUEST.value();
    }

    @Override
    public String getMessage() {
        return "테스트 예외입니다";
    }
}

4. ExceptionHandler만들기

물론 해당 Exception이 발생하는 클래스에서 try-catch를 써서 할 수 있지만 그렇게 하면 해당 클래스의 기능?분류가 안됨 Exception만 커리하는 클래스를 만들어서 분리하는게 좋음

@Slf4j
@ControllerAdvice
public class CustomExceptionHandler {

    @ExceptionHandler(AbstractException.class)
    protected ResponseEntity<?> handelCustomExcpetion(AbstractException e){
        ErrorResponse error = ErrorResponse.builder()
                                            .message(e.getMessage())
                                            .code(e.getStatusCode())
                                            .build();
        return new ResponseEntity<>(error, HttpStatus.resolve(e.getStatusCode()));
    }
}
profile
깊게 공부해보자

0개의 댓글