본문 바로가기
Language/Java

[Java] 예외처리의 모든 것

by 애기 개발자 2025. 4. 30.
반응형

1. try-catch-finally 기본 구조

 

  • try 블록: 예외가 발생할 수 있는 코드 작성
  • catch 블록: 예외 발생 시 실행될 코드
  • finally 블록: 예외 여부와 상관없이 항상 실행되는 코드

예시 코드

try {
    int result = 10 / 0; // 예외 발생
} catch (ArithmeticException e) {
    System.out.println("0으로 나눌 수 없습니다.");
} finally {
    System.out.println("무조건 실행됩니다.");
}

 

 

finally는 return 보다 항상 늦게 실행 됩니다.
System.exit(0) 호출 시 finally는 실행되지 않습니다.

2. try-with-resources

Java 7 이상부터 사용 가능한 기능입니다.

AutoCloseable 인터페이스로, try에 ()를 넣어 작성합니다.

try 블럭 밖으로 나가면 자동으로 close()

 

예시 코드

try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
    System.out.println(br.readLine());
} catch (IOException e) {
    e.printStackTrace();
}

 

try() 괄호 안에서 BufferedReader를 선언합니다.

만약 try - with - resources 구조로 생성하지 않았다면, br.close()가 반드시 호출되어야 합니다.

 

하나의 괄호 안에 여러가지를 선언하고자 한다면 ; 으로 구분할 수 있습니다.

예시

try (PreparedStatement insertPstmt = conn.prepareStatement(insertSQL.toString());
		PreparedStatement updatePstmt = conn.prepareStatement(updateSQL.toString());) {
                    
} catch (Exception e) {
	...
}

 

위의 코드는 PreparedStatement를 선언한 insertPstmt와 updatePstmt를 동시에 선언하였다.

해당 try 블럭을 벗어나면 두 값은 자동으로 close 처리 된다.


3. 다양한 catch 예외 처리

대표적인 예외 클래스

예외 클래스 설명

예외 클래스 설명
IOException 입출력 오류
FileNotFoundException 파일이 존재하지 않음
SQLException DB 접근 시 오류
NullPointerException 객체가 null일 때 접근 시도
ArithmeticException 0으로 나누기 등 수학 오류
IllegalArgumentException 잘못된 매개변수 전달 시

 

다중 catch 처리

try {
    // 예외 발생 가능성 있는 코드
} catch (IOException | SQLException e) {
    e.printStackTrace();
}

 

를 사용하여 구분

 

Q. Exception 만 써도 되는것 아닌가? 왜 여러가지 예외 처리를 구분하는 가?

catch (Exception e) 만 사용해도 프로그램이 수행하는데 문제 없음.

다만, 문제의 원인을 정확히 파악하기 위해 catch 예외처리를 다양화 하는게 좋음.

 

catch (Exception e) {
    // 뭔가 잘못됐지만, IO 문제인지 DB 문제인지 모름.
}

 

또한, 각 예외마다 다른 처리 방식을 지정해줄 수 있는 유연성이 확보됨.

 

try {
    readFile();
    connectDatabase();
} catch (FileNotFoundException e) {
    // 파일 생성 제안
} catch (SQLException e) {
    // DB 재연결 로직
} catch (Exception e) {
    // 기타 예외 로깅
}

 

 

4. 예외 출력 방법

이제 catch 에 Exception 까지 추가했다. 하지만 예외를 출력하는 방법 또한 다양하다.

 

방법 설명
e.printStackTrace() 예외 발생 위치 포함 전체 스택 트레이스 출력 (가장 디버깅에 유용)
e.getMessage() 예외에 대한 간단한 메시지만 출력
e.getLocalizedMessage() 로케일에 맞춘 메시지 (거의 동일하지만 메시지를 다국어로 구성할 때 유용)
System.out.println(e) toString() 결과 출력 (클래스: 메시지)

 

예시 코드

try {
    int a = 5 / 0;
} catch (Exception e) {
    e.printStackTrace();                 // 전체 예외 정보
    System.out.println(e.getMessage());  // "/ by zero"
    System.out.println(e);               // "java.lang.ArithmeticException: / by zero"
}

 

e.printStackTrace() 는 개발 과정에서 주로 사용하면 좋다.

하지만 실무 단계에서는 개발이 아닌 서비스의 단계이므로 로그파일에 남겨둬야만 한다.

 

로그파일에 e 혹은 e.getMessage()를 남겨두면 예외가 발생한 지점에서 로그파일에 남겨지니 추후 관리가 용이하다.

 

반응형

댓글