Error와 Exception에 대해 알아보자

햐얀하늘·2023년 10월 21일
0

Error란 무엇인가?

1. 개념

개발자가 미리 에측하여 방지할 수 없고 시스템이 종료될 정도로 수습할 수 없는 심각한 문제이다.

2. Error의 종류

가장 흔한 오류들

  • StackOverflowError : 호출의 깊이가 깊어지거나 재귀가 지속되어 stack overflow를 발생 시키는 오류
    대처방법 : 딱히 대처 방법이 존재하지 않음 -> 발생할지 안할지 예측이 어려움
    고로 에러가 발생되고 나서 루프를 빠져나오면 해결됨

  • OutOfMemoryEror : 할당된 메모리의 부족으로 더 이상 객체를 할당할 수 없을때 던져지는 오류
    대처 방법 : jvm옵션 수정, heap사이즈 확대 등

그 외의 오류들

Exception이란 무엇인가?

1. 개념

개발자가 구현한 로직에서 발생한 실수나 사용자의 영향으로 발생함.
오류와 달리 개발자가 미리 예측하여 방지할 수 있어 상황에 맞는 예외처리를 해줘야한다.

  • NullPointException : 객체를 사용해야 하나 null을 사용할 경우 발생
  • IllegalArgumentException : method가 허가되지 않거나 부적절한 argument 받을시 발생

2. Exception의 종류

  1. Checked Exception
    - 예외처리가 필수!!!, 처리하지 않으면 컴파일자체가 안됨
    try catch 문 or throw로 처리
  • 트랙잭션이 rollback 되지 않음
  • Exception을 바로 상속 받음
  • 예외가 발생하는 메서드에서 throws 예약어를 활용해 예외를 호출한 메서드에 전달하는 방법으로 처리가능

ex) IOException,SQLException 등

// Exception상속 -> Checked Exception
// Position이라는 객체의 positon이 유효하지 않을 경우 던져진다.

public class InvalidPositionException extends Exception {
	public InvalidPositionException(String message) {
    	super(message);
    }
}
// InvalidPositionException가 발생하면 해당 생성자를 호출한 메서드로 Exception을 전달하기 위해 throws 예약어를 사용한다.

public class Position {   
    public Position(String position) throws InvalidPositionException {
        if (position.length() != 2) {
            throw new InvalidPositionException(position + "은 위치 값 형식에 맞지 않습니다.");
        }
        
        x = (int) (position.charAt(0) - 'a');
        y = Integer.parseInt(position.substring(1))-1;
    }
    
    [...]
}

출처 : https://toneyparky.tistory.com/40

  1. UncheckedException
  • 예외에 대한 대처코드가 없어도 컴파일 진행
  • RuntimeException을 상속받음
  • 트랙잭션 rollback가능
  • 예외 발생 메서드에서 throws 예약어를 활용해 처리할 필요가 없음.
  • 명시적으로 예외 처리를 강제하지 않음

ex) NullPointerException, IndexOutOfBoundException

public class DuplicateEmailException extends RuntimeException{
    public DuplicateEmailException(String message) {
        super(message);
    }
}
public void checkEmail(String memberEmail) throws DuplicateEmailException {
        if (memberRepository.findByEmail(memberEmail).isPresent()) {
            throw new DuplicateEmailException("이미 존재하는 이메일입니다.");
        }
    }

CheckedException과 UncheckedException의 차이는?

예외처리를 해야하는가 하지 않아도 되는가!!!!!!
CheckedException은 반드시 예외처리 체크!!
UncheckedException은 예외처리 안해도댐!!

구분Checked ExceptionUnchecked Exception
확인 시점컴파일 시점런타임 시점
예외 처리명시적 예외처리 강제명시적 예외 처리 하지않음
트랙잭션 처리예외 발생 시 롤백X예외 발생 시 롤백O
종류IOException, FileNotFoundExceptionNullpointException, ClassCastException

ps)
compile time = 기계가 읽을 수 있는 형태로 변환
runtime = 변환된 exe파일을 실행하는 것
즉 complie 진행 후 run 고로
Checked Exception은 컴파일에서 확인하고 예외발생 고로 런타임까지 가지 않음
Unchecked Exception은 컴파일은 되나 런타임에서 예외가 발생하는 것

Exception 객체의 정보활용

  • Throwable의 주요 메서드
  1. public String getMessage() : 발생된 예외에 대한 구체적인 메시지 반환
  2. public Throwable getCause() : 예외의 원인이 되는 Throwable 객체 또는 null을 반환
  3. public void printStactTrace() : 예외가 발생된 메서드가 호출되기 까지의 메서드 호출 스택을 출력 / 디버깅의 수단으로 주로 사용

예외 처리 방법

throws Exception을 이용해 예외의 책임을 호출하는 곳으로 던저버리는것!!

말그대로 throw Exception

public class LoginService implements UserDetailsService {

    private final MemberRepository memberRepository;

    @Override
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
        Member member = memberRepository.findByEmail(email)
                .orElseThrow(() -> new UsernameNotFoundException("해당 이메일이 존재하지 않습니다."));

        return org.springframework.security.core.userdetails.User.builder()
                .username(member.getEmail())
                .password(member.getPassword())
                .roles("USER")
                .build();
    }
}

try-catch를 이용해서 예외에 대한 처리를 직접 하는것

  • try 블록에서 예외 발생시
  • JVM이 해당 Exception 클래스의 객체 생성 후 던짐 : throw new XXXException()
  • 던저진 exception을 처리할 수 있는 catch블록에서 받은 후 처리
  • 정상적으로 처리시 try catch블록을 벗어나 다음 문장 진행
  • try 블록에서 예외가 발생하지 않으면
  • catch문을 거치지 않고 try-catch 다음 흐름문장 실행
  1. 다중 exception handling
  • try 블록에서 여러 종류의 예외 발생 시
  • 하나의 try 불록에 여러개의 catch블록 추가 가능
try {
	// exception이 발생할 만한 코드
} catch (XXException e) {
	// exception이 발생할 만한 코드
} catch (YYException e) {
	// exception이 발생할 만한 코드
} catch (Exception e) {
	// exception이 발생할 만한 코드
}

다중 catch 문장 작성 순서 유의사항

  • JVM이 던진 예외는 catch문장을 찾을때 다형성 적용
  • 상위 타입의 예외가 먼저 선언될 시 뒤에 등장하는 catch블록은 동작X
    즉 Exception 예외는 가장 최상위 예외기 때문에 제일 뒤에서 써야함
  • 상속 관계가 없는 경우 무관
  • 상속 관계에서는 작은 범위에서 큰 범위 순으로 예외 처리
  1. try~catch~ finally 구문이용한 예외처리
  • finally는 예외 발생 여부와 상관 없이 언제나 실행
  • 중간에 return을 만나는 경우도 finally 블록 먼저 수행후 return 실행
profile
나는 커서 개발자가 될거야!

0개의 댓글