Chpt 8. 예외 - 주제 2. 예외의 처리
1. 인위적 예외 발생
프로그래머가 고의로 예외를 발생시킬 때는 다음과 같이 한다. 참고로 모든 예외 발생은 인스턴스를 생성한다.
throw new Exception("의도적으로 발생시킨 예외");
2. 예외 처리의 정의와 목적
예외 처리 정의: 예외 발생에 대비한 코드 작성
예외 처리 목적: 프로그램의 비정상적 종료 방지
3. 예외 처리 방법
예외를 처리하는 네 가지 방법이 존재한다.
1) try-catch문 (직접 처리)
try 블럭에서 예외가 발생 (예외 인스턴스 생성)
(1) 하지 않을 경우, try 블럭만 실행된다.
(2) 할 경우, 곧바로 catch 블럭 그룹으로 넘어간다.
(2-1) 생성된 예외 클래스의 인스턴스 instanceof 괄호 안 예외 타입이
(2-1-1) true면 해당 블럭 안의 코드만 실행된다.
(2-1-2) 모든 catch 블럭에 대해 false면 (3).
(3) finally 블럭이 실행된다.
catch 블럭이 여러 개인 경우 차례로 (2-1)를 계산해 하나의 catch 블럭만 실행된다. 그렇기 때문에 마지막 catch 블럭에 Exception을 배치하면 어떤 종류의 예외도 처리가 가능하다. 정리하면 try → catch → finally, 아니면 try → finally이다.
(2)에서 예외 인스턴스가 생성되는데 이 인스턴스의 메서드로는 printStackTrace()와 getMessage() 등이 있다. 이 메서드는 다음과 같은 역할을 한다.
기능 | |
printStackTrace() | (1) 호출 스택 안 메서드 정보, (2) 예외 메시지 출력 |
getMessage() | 예외 메시지 반환 |
[참고 1] 멀티 catch 블럭
멀티 catch 블럭을 사용하면 열 예외 클래스를 '|' 기호(논리 연산자 아님)를 이용해 연결할 수 있다. 다음과 같은 특징이 있다.
(1) 예외 클래스들은 조상-자손 관계일 수 없다.
(2) 예외 클래스들의 공통인 조상의 메서드만 사용할 수 있다.
2) 메서드에 예외 선언하기 (떠넘기기)
다음과 같이 메서드에 예외를 선언하며 checked 예외, Exception 예외를 선언하는 것이 일반적이다. 또한 Exception 클래스 간의 상속 관계를 잘 따져야 한다.
리턴 타입 메서드 이름(매개 변수들) throws Exception 1, Exception 2, ... , Exception N {};
[주의] thorws 키워드를 사용해 메서드에 예외를 선언했다고 예외가 처리가 된 것은 아니고, 호출한 쪽해서 try-catch문을 통해 처리를 해야 예외가 발생하지 않음을 주의하자.
3) 예외 되던지기 (직접 처리 + 떠넘기기)
예외를 되던지는 방법은 다음과 같다.
(1) 예외를 되던질 메서드에 throws 키워드를 사용해 예외를 선언한다.
(2) try-catch를 사용해 예외를 처리한다.
(3) throw를 통해 처리한 예외를 다시 던진다.
[참고] 예외를 되던지는 이유에 대해 생각하지 말고 그냥 이런 경우도 있구나 생각하고 넘어가면 된다.
4) 은폐
try-catch문