korea-wongi 2024. 6. 9. 02:14

체크 예외

  • RuntimeException을 상속하지 않은 예외
  • 컴파일러가 체크하지 때문에 예외처리 코드가 필요
  • IOException, SQLException 등이 있다.

언체크 예외

  • RuntimeException을 상속한 예외
  • 명시적인 예외처리가 필요하지 않다. 자동으로 예외를 발생시킨다.
  • NullPointerException, ArrayIndexOutOfBoundsException 등이 있다.

예외 처리 방법

  • 예외 복구
    • 예외가 발생한 상황에 대응해서 정상적인 상황으로 복구하는 방법.
    • 프로그램이 중단되지 않고 계속 실행할 수 있도록 한다.
    • 예) 로그인 요청 > 입력 값 오류 > 재입력 요청
  • 예외 회피
    • 현재 메서드에서 예외를 처리할 수 없거나, 처리하는 것이 적절하지 않은 경우 상위 호출자에게 예외를 전달
    • catch 한 예외를 그대로 throw 하는 것은 별 의미가 없다.
  • 예외 전환
    • 적절한 예외로 전환하는 것을 말한다.
    • 사용자 정의 예외를 만들어 가독성, 세세한 예외 처리가 가능
    • Exception으로만 처리를 하면 가독성이 떨어진다.
    • 예) 회원을 찾을 수 없을 경우 : MemberNotFoundException 사용자 정의 예외를 만들어 사용
  • 결론
    • 복구, 회피, 전환 중 뭐가 중요하다 보다는 예외 처리를 적절하게 하는 것이 중요하다.
    • 예외 케이스가 많은 것은 좋다고 생각한다고 한다. 처리를 제대로 못해서 사용자가 떠나면 안된다.

 

try-catch 안티패턴

  • 막연한 예외처리
    • 모든 예외를 exception으로 처리하면 어느 상황에 발생했는지 구분하기 어려울 수 있다.
  • 너무 잦은 catch
    • 컨트롤러에서도 쓰고, 서비스에서도 쓰고 하는 등
  • 무의미한 에러 넘기기
    • catch 로 예외를 잡고 내부에 다시 throw 던지는 코드
  • 무의미한 에러 캐치
    • catch로 예외 넣고 내부에 아무런 처리를 하지 않은 것!! 이것이 리얼 무의미다.

 

세세한 예외 처리 방안

  • 단순히 HTTP 상태 코드(400, 200)만 리턴해서는 적절한 상황을 확인할 수 없습니다. 예외 처리 시에는 상태 코드와 함께 에러 코드 및 에러 세부 사항을 포함해야 합니다.
  • 단순히 400, 200 만 리턴해서는 안된다. Status Code 만으로는 적절한 상황을 확인할 수 없음