서론
- java의 stack trace를 보면서 exception이 무엇으로 처리되는지, 처리되는 과정은 어떻게 되는지 궁금해서 찾아보기 시작.
Error vs Exception
Error
- 시스템에 비정상적인 상황이 생겼을 때 발생한다. 시스템레벨에서 발생하므로 심각한 수준의 오류. 개발자가 미리 예측하여 처리할 수 없으므로 애플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 됨.
-> 시스템에 변화를 주어 문제를 해결해야 함.
Exception
- 개발자가 구현한 로직에서 발생. 즉, 예외는 발생할 상황을 미리 예측하여 처리가 가능. 예외를 구분하고 그에 따른 처리 방법을 명확히 알고 적용하는 것이 중요하다.
Throwable class 구조
- 여기서 중요한 것은 CheckedException과 Unchecked Exception(Runtime Exception)
CheckedException
- RuntimeException을 제외한 모든 클래스가 여기에 속함.
- 반드시 예외 처리가 필요
- 컴파일단계에서 확인한다.
- 예외발생시 트랜잭션이 roll-back하지 않음.
- Exception의 상속받는 하위 클래스 중 Runtime Exception을 제외한 모든 예외를 말함.
- Try,Catch문, throw로 처리해줘야함.
UncheckedException
- RuntimeException과 그의 자식클래스
- 명시적인 처리를 강제하지 않는다.
- 실행단계에서 처리
- roll-back을 함.
- RuntimeException 하위 예외들
- NullPointerException
- IllegalArgumentException
- IndexOutOfBoundException
- SystemException
Exception 자세하게
exception 정의 : program의 실행시간동안 일어나는 이벤트로서 program instruction들의 일반적인 플로우를 방해하는 것을 말한다.
- 메소드 내부에서 exception이 발생하면, 메소드는 "object"를 생성하고 runtime system으로 넘겨준다. 이때 이 "object"를 exception object라고 부른다.
- exception에 대한 정보(타입, 발생 당시 program의 state)등을 담고 있음.
- exception object를 생성하고 runtime system으로 넘겨주는 작업을
throwing an exception
이라고 부른다.
-> runtime system은 JVM을 말하는듯 합니다.
exception handler 탐색과정
- method가 throw exception을 하고나면, runtime system은 이를 처리할 수 있는 무언가를 찾는다.
- 이 exception을 처리할 수 있는 "무언가"의 집합은 오류가 발생한 메서드에 도달하기 위해 호출된 메서드의 정렬된 목록중 일부
- 호출된 메서드의 정렬된 목록은 call stack으로 알려져 있다
- runtime system은
exception handler
라고 불리는 code block을 가진 메소드를 찾기 위해 call stack을 탐색한다.
- 이 탐색은 exception이 발생한 메소드로부터 시작되어 메소드가 호출된 지점까지 call stack을 통해 거꾸로 거슬러 올라간다.
- 적절한 handler를 찾으면, runtime system은 exception을 handler에 전달한다.
- 여기서 적절한 handler는 throw된 exception object의 type을 다룰 수 있는 것을 말한다.
- 선택된 exception handler를 catch the exception이라고 함.
- runtime system이 call stack의 모든 메서드를 찾아봐도 적절한 exception handler를 찾지 못하게 되면, runtime system이(결론적으로는 프로그램이) 종료된다.
참고