예외 처리 (Exception)

이재현·2024년 7월 26일

Java

목록 보기
10/15

🩵 오류

사람이 만들기에 완벽한 프로그램이란 없으며, 설령 완벽한 프로그램이라도 미처 제어하지 못하는 문제는 발생하기 마련이다.

그러한 문제를 오류(Error) 라고 규정하며, 이를 해결하기 위해 개발자들은 이러한 오류가 발생한 경우를 예외(Exception) 라고 규정한다.

그렇다면 이러한 예외에 대비해 미리 처리해둘 수 있고, 오류가 발생하게 되면 어떤 오류인지와 함께 프로그램을 종료시킬 수 있다.




🩵 예외

  • 오류(Error)
    일반적으로 회복이 불가능한 문제를 의미한다.
    이는 시스템 레벨에서, 혹은 환경적인 이유로 발생하게 된다.

  • 예외(Exception)
    일반적으로 회복이 가능한 문제를 의미한다.
    회복이 가능하다는 것은 그 예외에 대해 인지하고 대응할 수 있을 것이라는 의미이다.


💙 예외의 종류

코드 실행 관점에서의 종류

❤️ Compile Error

  • .java파일을 .class파일로 컴파일할 때 발생하는 에러
  • 대부분 구문 오류, 타입 오류, 잘못된 구문 등등 개발자의 실수로 발생한다.

❤️ Runtime Error

  • 컴파일은 잘 되었지만, 프로그램이 실행 도중 맞닥뜨리게 되는 에러

예외처리 관점에서의 종류

❤️ Checked Exception

  • 컴파일 시점에 확인하는 예외
  • 반드시 예외처리를 해줘야 하는 예외이다.
  • 인지한 문제에 대한 예외 처리를 했는지 확인할 수 있는 예외이다.

❤️ Unchecked Exception

  • 런타임 시점에 확인되는 예외
  • 예외처리는 반드시 필요하지 않다.



🩵 try-catch, finally 문

예외 처리의 흐름은 전체적으로 다음과 같다.
1. 예외를 어떻게 정의하는 지
2. 예외 발생을 알리고,
3. 사용자가 예외를 인지하고 핸들링하는지

💙 예외 정의

class MyException extends Exception {

	public MyException() {
		super(“예외는 ~~입니다.”);
	}
    
}

위와 같이 예외를 별도로 정의할 수 있고, 미리 자바에서 정의한 예외를 사용할 수도 있다.


💙 예외 알림

작성한 클래스, 메서드에 대해서 예외가 발생할 수 있음을 알리는 방법은 throw, throws 키워드를 사용하는 것이다.

class MyClass { 

	private final Boolean t = true;
    
	public void thisMethodIsDangerous() throws MyException { 
    
		if (t) {
			throw new MyException();
		}
        
	} 
}
throwsthrow
메서드의 이름 뒤에 붙어 해당 메서드가 어떤 예외사항을 던질 수 있는지 알려주는 예약어메서드 안에서, 실제로 예외 객체를 던질 때 사용하는 예약어
여러 종류의 예외사항을 적을 수 있다.실제로 던지는 예외 객체 하나와 같이 사용한다.
일반 메서드의 return 키워드처럼 throw 아래의 구문들을 실행되지 않으며, throw문과 함께 메서드가 종료된다.

💙 예외 핸들링

예외가 발생할 수 있음을 알게 됐다면, 그에 대한 대비로 try-catch(finally) 문을 사용할 수 있다.

❤️ Try - Catch & Finally

  • try 라는 의미에 맞게 중괄호 안에는 예외가 발생할 수 있지만 실행을 시도할 코드를 작성한다.

  • catch 라는 의미에 맞게 중괄호 안에는 try 안에 있는 코드를 실행하다가 예외가 났을 때 실행할 코드를 작성한다.

    • catch의 소괄호 안에는 어떤 예외 클래스를 받아 처리할 지 정의한다.
      (모든예외: Exception, 일부예외: 해당 예외클래스 명)
    • try 1개에 catch는 여러 개를 작성할 수 있다.
  • try-catch의 마지막에는 finally를 붙여 마지막에 반드시 실행할 코드를 넣을 수 있다.




🩵 예외클래스

예외 클래스도 다른 클래스들과 같이 자바의 원형인 Object 클래스에서 시작된다.

Throwable 클래스가 Object 클래스를 상속하고, 그 자식 클래스로 Error와 Exception 클래스가 있다.

Error 클래스와 Exception 클래스는 각각 IOError, RuntimeException 클래스로 구분하여 처리된다.

  • RuntimeException을 상속한 예외들은 UncheckedException, 상속하지 않은 예외들은 CheckedException으로 구현되어 있다.

즉 NullPointException, ArrayIndexOutOfBoundsException 등의 예외 구현체들은 명시적인 에러 처리를 하지 않아도 된다.

또한 Checked Exception에 속하는 에러 구현체들은 핸들링 하지 않으면 컴파일 에러가 발생하는 대신, 컴파일이 됐다면 복구가 불가능한 에러이다.




🩵 Chained Exception

예외는 다른 예외를 유발할 수 있는데, 이처럼 원인이 된 예외가 새로운 예외에 등록되어 또다른 새로운 예외를 발생시키는데, 이를 Chained Exception라 한다.

예외 연결의 이유는 여러 예외를 하나의 큰 예외로 묶어서 분류하기 위함이다.

CheckedException을 UncheckedException으로 포장(Wrapping)하는데 유용하게 사용되기도 한다.

initCause() // 지정한 예외를 원인 예외로 등록하는 메서드
getCause() // 원인 예외를 반환하는 메서드

0개의 댓글