들어가기에 앞서
개발을 하다 보면 다음과 같은 문구들을 자주 만나게 됩니다.
개발 공부를 처음 할 때에는 이런 문구들만 보면 갑자기 기분이 좋다가도 싫어지고, 뭔가 무섭고 그랬습니다.
하지만 예외라는 것은 개발자에게 무서운 것이 아닌 개발자에게 문제 상황을 알려주려고 하는 친근한 친구입니다.
이번 장에서는 Java에서 사용하는 예외에 대해서 알아보려고 합니다.
Exception 종류
자바는 총 세 종류의 예외가 존재합니다.
- Error
- Runtime Exception (Unchecked Exception)
- Checked Exception
[ Error ]
Error란 자바 프로그램 밖에서 일어나는 예외를 말합니다.
서버의 디스크가 고장 났다던가, 메인보드가 제대로 동작을 하지 않는다던가와 같이 자바 내에서 일어나는 문제보다는 외적인 요인에 의해 예외가 발생하는 경우에 Error라고 합니다.
[ Unchecked Exception ]
Runtime Exception이란 컴파일 당시에는 감지하지 못하지만 자바 프로그램이 실행되면서 문제가 생겼을 때 발생하는 예외입니다.
RuntimeException의 예로 많은 개발자들을 괴롭히는 NullPointerException
이 있습니다.
[ Checked Exception ]
Checked Exception이란 Error, Unchecked Exception을 제외한 모든 예외입니다.
Exception 출력
모든 Exception은 Throwable을 상속하고 있습니다.
Throwable은 기본적으로 예외 메세지를 출력하는 메서드가 존재합니다.
- getMessage()
- toString()
- printStackTrace()
public class ThrowableSample {
public static void main(String[] args) {
ThrowableSample sample = new ThrowableSample();
sample.throwable();
}
private void throwable() {
int[] intArray = new int[5];
try {
intArray = null;
System.out.println(intArray[5]);
} catch (Throwable t) {
System.out.println(t.getMessage());
System.out.println(t.toString());
t.printStackTrace();
}
}
}
다음과 같은 코드가 있다고 가정할 때 실행 결과는 다음과 같습니다.
Exception 처리 전략
- Becareful what you log
- 로그 파일에는 보호되지 않는 데이터만 출력 되도록 해야합니다.
- Don't bury thrown exceptions
- bury란 예외를 잡아서 아무것도 하지 않는 것을 말합니다.
- 예외를 캐치 했을 때에는 적어도 예외 이름과 이유를 남겨주어야 해결을 하기 수월합니다.
- Use a global Exception handler
- 코드에서 잡히지 않은 에러들을 처리하기 위해 Exception handler를 사용해야 합니다.
- Don't close resources manually
- JVM이 try - catch 구문이 끝나면 자동으로 리소스를 닫아주기 때문에 수동으로 닫지 않아도 됩니다.
- Throw early and handler exceptions late
- 에러가 발생했을 때 최대한 빨리 에러를 발생 시키고 이를 처리하는 것은 최대한 늦게 해야합니다.
- 메서드의 종료시에 에러를 잡으면 코드를 읽기 쉽고 유지보수하기 쉽습니다.
- Don't log and rethrow Java exceptions
- 에러에 대해 로그를 남겼으면 그 에러는 더이상 던지지 말아야 합니다.
- 에러가 발생 했을 때 어느 부분에서 에러가 발생했는지 찾기 어렵습니다.
- Check for suppressed exceptions
- Explicitly define exception in the throws cause
- generic 대신 명확한 예외 세트를 사용하는 것이 좋습니다.
- 그로 인해 다른 개발자들이 특정 상황에서 오류가 발생할 경우 사용할 수 있는 다양한 오류 처리 루틴을 알 수 있습니다.
- Catch the most explicit exception first
- 더 구체적인 예외를 먼저 잡지 않는 경우 JVM이 compile time error 를 발생시킵니다.
- Use modern exception handling semantics
보다 자세한 사항은 출처를 확인 부탁드립니다
출처 : theserverside
'Java' 카테고리의 다른 글
[Java] Enum 전용 Map, Set이 있다? (0) | 2023.06.20 |
---|---|
[Java] final 키워드 그리고 effectively final (0) | 2023.06.13 |
[Java] Object란 무엇인가요? (0) | 2023.06.02 |
[모던 자바 인 액션] 동작 파라미터화 (2) | 2023.05.10 |
오버로딩과 오버라이딩에 대해 (0) | 2023.05.01 |