Post

오류 및 예외에 대해 예외처리

  • 오류: 일반적으로 회복이 불가능한 (시스템 레벨)
  • 예외: 일반적으로 회복이 가능한 (코드 레벨)

예외 종류

  1. 코드 실행 관점
    • 컴파일 에러: 있지 않은 클래스를 호출한다거나 접근이 불가능한 프로퍼티나 메소드에 접근할 때 발생 문법에 맞게 다시 작성 필요!
    • 런타임 에러: 프로그램 실행도중 발생하는 예외
  2. 예외처리 관점
    • 확인된 예외: 컴파일 시점(이미 특정한 문제를 인지 하고 있어서 컴파일 하는 동안 확인 가능)
    • 미확인된 예외: run 타임 시점 확인되는 예외

예외 처리 흐름

  • 우리가 예외를 어떻게 정의할 것인가 (예외 클래스를 만들어서 예외를 정의)
  • 예외가 발생 할 수 있음을 알림
  • 사용자는 예외가 발생 할 수 있음을 알고 예외를 핸들링 하는가

throw, throws 메서드

throwsthrow
메서드 이름 뒤에 붙어 이 메서드가 어떠한 예외사항을 던질 수 있는지 알려주는 예약어메서드 안에서 실제로 예외 객체를 던질 때 사용하는 예약어
여러 종류의 예외사항 적을 수 있다실제로 던지는 예외 객체 하나와 같이 써야 함
 throw 아래의 구문들은 실행되지 않고 종료됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class StudyException {
    public static void main(String[] args) {
        OurClass ourClass = new OurClass(); //인스턴스화

        try {
            ourClass.thisMethodIsDangerous();
        } catch (OurBadException e) {
            System.out.println(e.getMessage());
        } finally {
            System.out.println("우리는 방금 예외를 handling 했습니다!");
        }

    }
}

try-catch문

로직

image

  • 일단 try{}하고 예외가 발생하면 OurBadException ecatch(){}한다
  • e.getMessage() 메서드를 통해 예외 내용을 출력할 수 있다
  • finally{}마침내 수행돼야 하는 로직을 수행한다

Throwable Class

  • “문제 상황”을 뜻하는 Throwable 클래스가 Object 클래스를 상속

image

  • RuntimeException을 상속한 예외들은 UncheckedException
    반대로 상속하지 않은 예외들은 CheckedException으로 구현

Chained Exception (연결된 예외)

인과관계를 설명할 수 있는 예외

  • initCause() 메서드: 지정한 예외를 원인 예외로 등록
  • getCause() 메서드: 원인 예외를 반환

예외 처리하기

  1. 예외 복구하기 (자주 사용 X)
1
2
3
4
5
6
7
   public String getDataFromAnotherServer(String dataPath) {
		try {
				return anotherServerClient.getData(dataPath).toString();
		} catch (GetDataException e) {
				return defaultData; // 종료하고 정상적인 데이터를 반환 
		}
}
  1. 예외 처리 회피하기 (흘려보낸다)
1
2
3
4
5
public void someMethod() throws Exception { ... }

public void someIrresponsibleMethod() throws Exception {
		this.someMethod();
}
  1. 예외 전환하기(예외처리에 더 신경쓰고싶은 경우)
1
2
3
4
5
6
7
8
9
public void someMethod() throws IOException { ... }

public void someResponsibleMethod() throws MoreSpecificException {
		try {
			this.someMethod();
		} catch (IOException e) {
			throw new MoreSpecificException(e.getMessage());
		}
}
This post is licensed under CC BY 4.0 by the author.