studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • 쓸데없이 Exception 쓰지 않기
  • Exception vs RuntimeException vs Error
  • Exception
  • RuntimeException
  • Error
  • 쓸데없이 Checked Exception 쓰지않기
  1. Java 관련 정리
  2. Effective Java

9장 - Exception

쓸데없이 Exception 쓰지 않기

예를 들어 반복문 빠져나오기위해 Exception을 쓴다던가 하는 경우. 정상적인 흐름에 Exception을 전제로 깔고 코드 짜지 말라는 뜻. 비슷한 관점에서 API를 쓸 때 반드시 Exception을 catch해야만 쓸 수 있다면 좋은 API가 아니다. Iterator 은 그래서 hasNext()를 가지고 있고 Optional 은 isPresent() 를 가지고 있다. 얘들을 보고 state-testing 메소드라고 부르는데 state-dependent한 Iterator.next() 또는 Optional.get() 을 호출하기 전에 미리 검사해서 Exception을 피할 수 있도록 해준다.

  1. JVM이 정상적으로 최적화할 수 없는 경우가 발생할 수 있음 -> 성능 저하

  2. 의도된 상황과 또 다른 예외 케이스가 발생한다거나 할 때 디버깅이 아주 어려워질 수 있음

  3. 당연히 코드 알아보기도 어려움

Exception vs RuntimeException vs Error

Exception

checked exception이라고 부르기도 함. 만약에 이 Exception을 throw하면 반드시 try-catch문을 사용해서 처리해야만 함. 즉, API의 사용자에게 강력한 경고 또는 암시를 줄 수 있음. try-catch문을 사용해서 어떤 특별한 조치를 취하면 그대로 쓰레드를 이어나갈 수 있는 그런 케이스에 사용해야 함. 물론 API 사용자가 무시할 수도 있겠지만 이거는 사용자 문제고.

RuntimeException

unchecked exception이라고 부르기도 함. try-catch로 꼭 감싸줄 필요는 없음. 오히려 catch를 안 하는게 좀 더 바람직한 상황이 많음. RuntimeException을 throw하는건 발생한 상황이 복구도 불가능하고 계속 실행해봤자 득될게 없는 상황일 때여야 함. 달리 말하면 에러메세지를 보여주면서 쓰레드가 종료되는게 더 좋은 상황임. 만약에 복구가 가능한지 불가능한지 긴가민가하다면 RuntimeException이 더 좋은 선택임.

RuntimeException은 주로 프로그래밍 에러를 나타냄. 주로 validation에 실패한 경우가 많음. 가령 예를 들어 배열에서 어떤 원소를 호출할 때 그 index는 0부터 length - 1이어야 하는데 음수거나 length보다 큰 숫자를 넣으면 RuntimeException을 던지는 것과 비슷함.

Error

마찬가지로 unchecked exception인데, JVM에서 리소스 부족이나 불변 규칙 위반에 따른 상황, 실행이 불가능항 상황에 사용함. 그러므로 프로그래머가 사용하는 일은 없다고 봐도 됨.

쓸데없이 Checked Exception 쓰지않기

checked exception이 던져지면 api 사용자 입장에서는 try-catch로 처리하던가 다시 throw로 한번 더 던져야하는데 코드도 덕지덕지 늘어나고 이래저래 부담이 큼. 그러므로 가급적이면 안 쓰는게 좋음. 만약에 catch문의 내용으로 아예 프로그램을 종료하는 코드거나 다시 throw하는 코드가 많다면 checked보단 unchecked가 더 나을 수 있다는 뜻임. 그리고 그냥 checked를 unchecked로 바꾸고 싶은 케이스도 있을건데 그럴 땐 아까 위에서 언급한 state-testing, state-dependent 메소드처럼 두개로 쪼개는 방법이 있음.

Previous8장 - 프로그래밍 일반NextJava8 Lambda expression

Last updated 7 years ago