반응형
 

예외 처리: 개념과 활용

소프트웨어 개발에서 **예외 처리(Exception Handling)**는 프로그램 실행 중 발생할 수 있는 오류를 처리하고, 예측 불가능한 상황에서도 프로그램의 안정성을 유지하는 데 중요한 역할을 합니다. 이 글에서는 예외 처리의 개념과 자바(Java)에서의 구현 방법, 다양한 활용 예시를 살펴보겠습니다.


예외(Exception)란 무엇인가?

**예외(Exception)**는 프로그램 실행 중 발생하는 비정상적인 상태를 의미하며, 코드의 정상적인 흐름을 방해할 수 있습니다. 예외는 주로 잘못된 사용자 입력, 네트워크 연결 문제, 파일 접근 오류 등 외부 요인으로 인해 발생합니다.

예외의 분류:
  1. 체크 예외(Checked Exception):
    • 컴파일 시점에 처리해야 하는 예외.
    • 예: IOException, SQLException 등.
  2. 언체크 예외(Unchecked Exception):
    • 실행 시점에 발생하며, 처리하지 않아도 컴파일 오류가 발생하지 않음.
    • 예: NullPointerException, ArithmeticException 등.
  3. 에러(Error):
    • 주로 JVM에서 발생하며, 복구가 불가능한 심각한 문제.
    • 예: OutOfMemoryError, StackOverflowError 등.

자바에서 예외 처리의 기본 구조

자바에서는 예외를 처리하기 위해 try-catch-finally 블록과 throwthrows 키워드를 사용합니다.

예제:
import java.io.*;

public class ExceptionExample {
    public static void main(String[] args) {
        try {
            File file = new File("test.txt");
            BufferedReader br = new BufferedReader(new FileReader(file));
            System.out.println(br.readLine());
        } catch (FileNotFoundException e) {
	        System.out.println("파일을 찾을 수 없습니다: " + e.getMessage());
        } catch (IOException e) {
     	   System.out.println("입출력 오류 발생: " + e.getMessage());
        } finally {
        	System.out.println("예외 처리를 마쳤습니다.");
        }
    }
}
출력 결과 (파일이 없는 경우):
 
파일을 찾을 수 없습니다: test.txt (No such file or directory)
예외 처리를 마쳤습니다.

예외 처리의 주요 구성 요소

  1. try 블록:
    • 예외가 발생할 가능성이 있는 코드를 포함.
  2. catch 블록:
    • 발생한 예외를 처리.
  3. finally 블록:
    • 예외 발생 여부와 관계없이 항상 실행되는 코드 (자원 해제에 주로 사용).
  4. throw 키워드:
    • 예외를 명시적으로 발생시킴.
  5. throws 키워드:
    • 메서드에서 처리하지 않은 예외를 호출자에게 전달.
예제:
public class CustomExceptionExample {
    public static void main(String[] args) {
        try {
        	validateAge(15);
        } catch (IllegalArgumentException e) {
    	    System.out.println("예외 발생: " + e.getMessage());
        }
    }

    public static void validateAge(int age) {
        if (age < 18) {
        	throw new IllegalArgumentException("나이는 18 이상이어야 합니다.");
        }
        System.out.println("나이 검증 통과");
    }
}
출력 결과:
 
예외 발생: 나이는 18 이상이어야 합니다.

사용자 정의 예외 만들기

자바에서는 표준 예외 클래스 외에도 사용자 정의 예외를 생성할 수 있습니다.

예제:
class CustomException extends Exception {
    public CustomException(String message) {
	    super(message);
    }
}

public class CustomExceptionDemo {
    public static void main(String[] args) {
        try {
	        checkNumber(-1);
        } catch (CustomException e) {
    	    System.out.println("예외 발생: " + e.getMessage());
        }
    }

    public static void checkNumber(int number) throws CustomException {
        if (number < 0) {
	        throw new CustomException("숫자는 음수가 될 수 없습니다.");
        }
        System.out.println("숫자 검증 통과: " + number);
    }
}
출력 결과:
 
예외 발생: 숫자는 음수가 될 수 없습니다.

다양한 활용 예시

  1. 파일 처리:
    • 파일 입출력 시 예외를 처리하여 파일이 없거나 읽기/쓰기 권한이 없는 경우에 대처.
  2. 네트워크 연결:
    • 네트워크 오류 발생 시 재시도 또는 사용자 알림.
  3. 데이터 검증:
    • 잘못된 입력 데이터를 걸러내고 적절한 피드백 제공.
  4. 트랜잭션 관리:
    • 데이터베이스 작업 중 예외 발생 시 롤백 처리.
예제:
import java.sql.*;

public class TransactionExample {
    public static void main(String[] args) {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb", "user", "password");
            connection.setAutoCommit(false);

            Statement stmt = connection.createStatement();
            stmt.executeUpdate("INSERT INTO accounts (id, balance) VALUES (1, 1000)");
            stmt.executeUpdate("INSERT INTO accounts (id, balance) VALUES (2, 2000)");

            connection.commit();
        } catch (SQLException e) {
            System.out.println("데이터베이스 오류: " + e.getMessage());
            if (connection != null) {
                try {
                    connection.rollback();
                    System.out.println("롤백 완료");
                } catch (SQLException rollbackEx) {
	                System.out.println("롤백 실패: " + rollbackEx.getMessage());
                }
            }
        } finally {
            if (connection != null) {
                try {
	                connection.close();
                } catch (SQLException closeEx) {
    	            System.out.println("연결 종료 실패: " + closeEx.getMessage());
                }
            }
        }
    }
}
출력 결과:
 
데이터베이스 오류: Duplicate entry '1' for key 'PRIMARY'
롤백 완료

마치며

예외 처리는 자바 애플리케이션의 안정성을 높이고, 오류 상황에서도 적절히 대응할 수 있도록 돕는 필수적인 도구입니다. 다양한 상황에서 적절히 예외를 처리하여 안정적이고 신뢰할 수 있는 코드를 작성해 보세요!

 
반응형

+ Recent posts