실행되고 있는 프로그램이 비정상적인 종료가 된다거나 오작동을 하게 되면 심각한 문제를 야기하게 됩니다. 이러한 문제를 야기하는 원인에는 바로 Error와 Exception이 있습니다. 이번 포스팅은 Error(오류)와 Exception(예외)의 차이를 명확히 구분하고, 예외 처리(Exception Handling)에 대해 알아보도록 하겠습니다.
Error와 Exception의 차이는?
오류(Error)는 시스템 수준에서 발생하는 심각한 예외 상황을 말합니다. 일반적으로 개발자가 코드에서 직접 수정할 수 없으며, 보통 소프트웨어 외적인 부분에서 발생하는 문제를 의미합니다. 하지만 예외(Exception)는 프로그램 실행 도중 예상치 못한 상황이 발생할 때를 말합니다. 오류와 다르게 예외는 프로그램 내부에서 코드로 처리 가능하며, 적절한 예외 처리를 통해 시스템의 안정성과 발생하는 문제를 사전에 예방 가능합니다. 또한 지금부터 사용할 언어인 Java에서는 유연하게 예외를 처리할 수 있는 방법을 제공합니다.
Checked Exception VS Unchecked Exception
Java에서 발생하는 예외는 크게 Checked Exception, Unchecked Exception으로 분류됩니다. checked Exception은 컴파일 단계에서 확인할 수 있는 예외로 반드시 try-catch문을 사용하거나 메서드에 throws 선언을 하여야 합니다. 반면에 Unchecked Exception은 런타임 도중 발생하는 예외로 반드시 처리하진 않아도 됩니다. 예시 코드는 다음과 같습니다.
// Checked Exception: FileNotFoundException을 처리하는 코드
public class FileProcessor {
public void processFile(String filePath) throws FileNotFoundException {
try {
// 파일을 읽는 로직
FileReader fileReader = new FileReader(filePath);
// 파일을 처리하는 로직
// ...
} catch (FileNotFoundException e) {
// 파일을 찾을 수 없는 경우 예외 처리
System.err.println("파일을 찾을 수 없습니다: " + filePath);
throw e; // 예외를 다시 던져서 호출자가 처리하도록 함
}
}
}
// Unchecked Exception: ArithmeticException을 처리하지 않는 코드
public class MathCalculator {
public int divide(int dividend, int divisor) {
return dividend / divisor;
}
public static void main(String[] args) {
MathCalculator calculator = new MathCalculator();
int result = calculator.divide(10, 0); // 0으로 나누기로 인한 ArithmeticException 발생
System.out.println("결과: " + result); // 실행되지 않음
}
}
여러 가지 예외가 발생할 수 있는 상황이라면?
프로그래밍을 하다 보면 여러 가지 예외가 발생할 수 있는 상황이 있습니다. 이러한 상황에서는 다중 try-catch문을 활용하여 다양한 예외처리를 한 번에 할 수 있습니다. 예시는 다음과 같습니다.
public class MultipleCatchExample {
public void divide(int dividend, int divisor) {
try {
int result = dividend / divisor;
System.out.println("나누기 결과: " + result);
} catch (ArithmeticException e) {
System.err.println("0으로 나눌 수 없습니다.");
} catch (Exception e) {
System.err.println("예상치 못한 오류가 발생했습니다.");
}
}
public static void main(String[] args) {
MultipleCatchExample example = new MultipleCatchExample();
example.divide(10, 0); // 0으로 나누기로 인한 ArithmeticException 처리
}
}
Exception Handling(예외 처리) 시 고려 사항
Exception Handling(예외 처리)은 프로그램의 안정성과 사용자 경험을 향상하는데 큰 역할을 할 수 있습니다. 하지만 이러한 예외 처리에도 고려할 사항이 있습니다.
올바른 예외 메시지 처리
예외 처리를 하는 과정에서 사용자가 어떠한 예외가 발생하였는지 알 수 있는 올바른 메시지 처리를 해야 합니다.
public class UserFriendlyException {
public void processUserData(String username, int age) {
try {
// 유저 데이터 처리 로직
if (age < 0) {
throw new Exception("나이는 0보다 작을 수 없습니다.");
}
// 데이터 처리 작업
// ...
} catch (Exception e) {
System.err.println("오류: " + e.getMessage());
System.err.println("유저 정보 처리 중 문제가 발생했습니다. 다시 시도해주세요.");
}
}
public static void main(String[] args) {
UserFriendlyException exception = new UserFriendlyException();
exception.processUserData("user123", -10); // 나이가 음수로 인한 오류 메시지 출력
}
}
원인 파악을 할 수 있는 로깅
예외가 발생하였을 때 로깅을 할 수 있도록 예외 상황을 기록해야 합니다. 이러한 기록은 문제 발생 시 원인을 빠르게 파악하고 조치할 수 있는 기회를 제공합니다.
import java.util.logging.*;
public class ExceptionRecovery {
private static final Logger LOGGER = Logger.getLogger(ExceptionRecovery.class.getName());
public void processData() {
try {
// 데이터 처리 로직
// ...
throw new Exception("데이터 처리 중 오류 발생");
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "데이터 처리 오류: " + e.getMessage(), e);
// 오류 회복 작업 수행
// ...
}
}
public static void main(String[] args) {
ExceptionRecovery recovery = new ExceptionRecovery();
recovery.processData();
}
}
'Languages > Java' 카테고리의 다른 글
[Java]문자열에 공백을 제거하는 방법(Trim, Replace, Stripe) (7) | 2023.08.10 |
---|---|
[Java]정규식(Regular Expression) - 유용한 문자열 처리를 위한 강력한 도구 (7) | 2023.07.23 |
[Java]인터페이스 - 객체지향 프로그래밍의 주요 개념과 활용방법 (6) | 2023.07.23 |
[Java]제네릭(Generic)을 쉽게 이해하기(문법과 활용) (2) | 2023.07.21 |
[Java]문자열(String)과 리스트(List)의 null, 빈 값인지 확인하는 방법 (15) | 2023.07.20 |