자바의 정석 8장. 예외처리
8장. 예외처리
1.1 프로그램 오류 p.414
컴파일 에러 : 컴파일 시에 발생하는 에러 런타임 에러 : 실행 시에 발생하는 에러 논리적 에러 : 실행은 되지만 의도와 다르게 동작하는 것
- 처리 가능 여부에 따라
에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 예외(exception) : 프로그램 코드에 의해 수습될 수 있는 다소 미약한 오류
1.2 예외 클래스의 계층구조 p.415
- Throwable
- Exception
Excetion클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 RuntimeException클래스들 : 프로그래머의 실수로 발생하는 예외
catch 순서 p.421
Exception.printStackTrace() vs @Slf4j logger.error() p.422 https://stackoverflow.com/a/10477646/4766882
printStackTrace()는 단순히 오류를 어딘가에 출력하는데 그치지만 Slf4j를 쓰면 출력을 할지 말지 부터 어디에 출력할지를 소스 수정없이 조절가능. 출력은 시스템 런타임 성능을 저하시키는 주요 요인
예외의 종류 : 컴파일러가 체크할 수 있는가
- checked : 컴파일러가 체크 가능. 컴파일 에러 발생(소스를 수정해야 컴파일 될 것이므로 코딩 시에 excetion에 대한 대처가 가능)
- unchecked : 컴파일러가 체크 불가능. 컴파일 에러 발생하지 않음
언제 Exception을 사용할까? 가능한 안써야 한다. 특히 ‘제어로직에 예외를 사용하지 마라’
- 소스 가독성 저하(goto문이랑 동일함)
- 런타임의 속도저하
언제 Exception(throws)을 사용할까?
호출stack이 깊을 때 예외 상황을 우아하게 처리하기 위해. ‘예외를 마지막에 처리하는 쪽은 최초 call을 발생시킨 객체다’
1.9 자동 자원 반환 - try-with-resources
- 소스가 많이 짧아져서 가독성이 좋아졌다.
- 해당 리소스는 AutoCloseable인터페이스를 구현해야 한다.
- before
- after
1.10 사용자정의 예외 만들기
필요에 따라 예외처리의 여부를 선택할 수 있는 ‘unchecked’예외가 강제적인 ‘checked예외’보다 더 환영받고 있다 👉 하지만 예외처리를 강제하기 위해서는 checked예외가 필요
1.12 연결된 예외(chained exception)
여러가지 예외(원인과 결과)를 하나의 큰 분류의 예외로 묶어서 다루기 위해
-
exception-handling-for-rest-with-spring : tutorials/spring-boot-rest at master · eugenp/tutorials
-
Exception Handling in Spring MVC : https://github.com/paulc4/mvc-exceptions
