커스텀 예외가 필요한 이유
일반적으로 자바 예외는 대부분의 상황을 다룰 수 있지만, 비즈니스 로직에 특화된 예외나 세분화된 예외 처리가 필요할 때가 있다. 이 경우는 커스텀 예외를 통해 문제를 보다 명확하게 전달할 수 있다.
주요 사용 이유
- 비즈니스 로직에 따른 예외 처리: 특정 비즈니스 로직에서 발생할 수 있는 오류를 명확하게 표현
- 기존 자바 예외를 세분화하여 특정 상황에 맞게 처리하기
자바의 예외는 크게 체크 예외와 언체크 예외로 나눌 수 있다. 다음 섹션에서는 두 경우 모두에 대해 사용자 정의 예외를 구현해본다.
사용자 정의 체크 예외(Custom Checked Exception)
체크 예외는 코드에서 명시적으로 처리해야 하는 예외이다. 예를 들어, 파일을 읽는 코드에서 파일이 존재하지 않는 경우 예외를 던진다.
try (Scanner file = new Scanner(new File(fileName))) {
if (file.hasNextLine()) return file.nextLine();
} catch(FileNotFoundException e) {
// Logging, etc
}
위 코드는 `FileNotFoundException` 예외를 던지지만, 파일이 존재하지 않는 것인지, 파일 이름이 잘못된 것인지 명확하지 않다. 이를 해결하기 위해 커스텀 예외를 만들어보자.
커스텀 예외를 만들려면 `java.lang.Exception` 클래스를 확장해야 한다.
public class IncorrectFileNameException extends Exception {
public IncorrectFileNameException(String errorMessage) {
super(errorMessage);
}
}
`java.lang.Exception` 을 상속받아 `IncorrectFileNameException`이라는 사용자 정의 예외를 생성했다. 이제 예외가 발생할 때 더 구체적인 오류 메시지를 제공할 수 있다.
사용 예시
try (Scanner file = new Scanner(new File(fileName))) {
if (file.hasNextLine())
return file.nextLine();
} catch (FileNotFoundException e) {
if (!isCorrectFileName(fileName)) {
throw new IncorrectFileNameException("Incorrect filename : " + fileName );
}
//...
}
하지만 이 경우 원래 예외의 원인 정보를 잃게 된다. 이를 해결하기 위해 `Throwable`인자를 받는 생성자를 추가할 수 있다.
public IncorrectFileNameException(String errorMessage, Throwable err) {
super(errorMessage, err);
}
이를 통해 원래 예외의 원인을 함께 전달할 수 있다.
try (Scanner file = new Scanner(new File(fileName))) {
if (file.hasNextLine()) {
return file.nextLine();
}
} catch (FileNotFoundException err) {
if (!isCorrectFileName(fileName)) {
throw new IncorrectFileNameException(
"Incorrect filename : " + fileName , err);
}
// ...
}
사용자 정의 언체크 예외(Custom Unchecked Exception)
이번에는 파일 이름에 확장자가 없을 때 발생하는 예외를 다루어보자. 이런 예외는 런타임 시에만 검출되므로 언체크 예외로 처리한다.
`RuntimeException`을 상속받아 언체크 예외를 생성할 수 있다.
public class IncorrectFileExtensionException extends RuntimeException {
public IncorrectFileExtensionException(String errorMessage, Throwable err) {
super(errorMessage, err);
}
}
사용 예시
확장자가 없는 파일 일므에 대한 커스텀 언체크 예외를 사용하는 예제이다.
try (Scanner file = new Scanner(new File(fileName))) {
if (file.hasNextLine()) {
return file.nextLine();
} else {
throw new IllegalArgumentException("Non readable file");
}
} catch (FileNotFoundException err) {
if (!isCorrectFileName(fileName)) {
throw new IncorrectFileNameException(
"Incorrect filename : " + fileName , err);
}
//...
} catch(IllegalArgumentException err) {
if(!containsExtension(fileName)) {
throw new IncorrectFileExtensionException(
"Filename does not contain extension : " + fileName, err);
}
//...
}
'Java' 카테고리의 다른 글
[Java] static이란? (1) | 2024.11.08 |
---|---|
[Java] Enum이란? (0) | 2024.11.01 |
[AssertJ] Exception Assertions (0) | 2024.10.31 |
객체 지향 프로그래밍(Object-Oriented Programming, OOP) (0) | 2024.10.26 |
[JUnit] @Parameterized Test (0) | 2024.10.26 |