Java의 예외 처리

60jong·2023년 4월 25일
0

Java

목록 보기
10/14

프로그램에서의 오류

프로그램에서는 오류가 발생하기 마련인데, 3가지 오류가 발생한다.

  • 컴파일 오류 : 컴파일 시에 발생하는 오류
  • 런타임 오류 : 실행 중에 발생하는 에러
  • 논리적 오류 : 실행 중 의도와 다르게 동작하는 오류

Java에서의 오류

Java는 소스코드(.java)를 컴파일한 뒤(.class) 이를 실행하게 된다.

Java에서는 문제가 있는 상황을 두 가지로 분류한다.

예외에러이다.
예외 : 프로그램에서 수습될 수 있는 미약한 오류
에러 : 프로그램에서 수습될 수 없는 심각한 오류

에러의 경우는 수습될 수 없는 심각한 오류이기 때문에, 프로그램이 비정상적으로 종료되게 된다. (OutOfMemoryError, StackOverFlowError 등)

하지만 예외는 비교적 덜 심각하기에 수습되어 비정상적인 종료를 막을 수 있다. by 예외 처리

예외 클래스 계층


계층 구조를 보면, Object -> Throwable -> Exception / Error로 나뉘는 것을 확인할 수 있다.


하지만 우리는 Exception에 대해 집중할 필요가 있다. (예외 처리는 프로그래머에게 달려있기에!!)

자바의 정석 책에서는 위 그림처럼 예외를 두 부류로 나눈다.

  • Exception 클래스와 그 자식들 (RuntimeException 제외) - 이하 1로 칭
  • RuntimeException 클래스와 그 자식들 - 이하 2로 칭

두 부류의 예외

1 그룹은 주로 외부의 영향으로 발생할 수 있는 것들이다. 사용자의 동작에 영향을 받는다.

하지만 2 그룹은 프로그래머의 실수에 영향을 받는다.

이러면 예외들은 예외 처리를 통해, 프로그램의 비정상적인 종료를 막아야 한다.


Java에서는 1 그룹에 대해서는 예외 처리를 강제하지만 (예외 처리 안 하면 컴파일 오류), 2 그룹에 대해서는 강제하지 않는다.

예외 처리 try-catch

Java에서 예외 처리는 try-catch 구문으로 한다.

try {
	doSomething();
} catch (Exception e) {
	doSomethingWhenException();
}

try 구문 안에서 예외가 발생하게 되면, 해당 예외 클래스에 해당하는 인스턴스가 생성되고, catch문을 차례대로 내려가며 instanceof 연산은 진행하게 된다. 그 중 true를 반환하는 catch 구문으로 들어가 내부 로직을 수행하게 된다.

하지만 모두 false라면, 예외는 처리되지 못한다. (이 상황이 걱정된다면 마지막 catch 구문에 Exception을 잡는 것도 방법이겠다.)

예외 처리 메서드 선언부

Java에서는 친절하게도 try-catch대신 메서드 선언부에 throws ~~Exception을 통해 해당 메서드에서 무슨 예외가 발생가능한 지 보여줄 수 있게 해준다. 이는 메서드를 사용하는 사람이 처리해야 할 예외를 명시적으로 알려주기에 좋다.

이 부분이 매우 충격이었다.
나는 요즘 개발을 할 때, 발생하는 예외는 발생한 메서드에서 처리하도록 하자는 생각 (어쩌면 어디서 예외가 발생했는지 근원을 알고 싶다는 나의 이기적인 생각...)이 있었다.
그로 인해 메서드 단에서 throw하는 예외는 없고, 모두 메서드 자체적으로 예외를 처리했다.

하지만 메서드 선언부에 예외를 선언하는 것의 장점을 들으며, 나의 방법에 대해 다시 생각하게 됐다.
메서드 자체에서 예외를 모두 처리하기보다는 caller에게 이를 넘기는 것이 SRP를 지키는 것이라는 생각도 들고, caller가 처리하도록 두는 것이 확장에 더 열려있다고 생각이 든다.

Reference

https://github.com/mingseok/javajungsuk3

profile
울릉도에 별장 짓고 싶다

0개의 댓글