[Java] 예외 (4) (feat.throw)

SeongEon Kim·2022년 5월 9일
0

JAVA

목록 보기
35/52
  1. 예외 던지기?

생활코딩님께서는 '예외 던지기'라고 소개했던 부분을 설명해보자.
왜 던지기 라는 단어로 소개하는가봤더니, 외부에 있는 파일 하나 생성해서 이클립스 프로젝트내 기입해놓고 불러오고자 할때, 그 파일 호출 과정을 수행할 수 없어서 이를 위한 처리를 생성자의 사용자에게 위임하겠다는 의미이기 때문이다. 따라서 던지다(throw)라는 표현을 사용한다.

아래 예시 코드를 통해 자세히 알아보자.

package org.opentutorials.javatutorials.exception;
import java.io.*;
public class CheckedExceptionDemo {
    public static void main(String[] args) {
        BufferedReader bReader = new BufferedReader(new FileReader("out.txt"));
        String input = bReader.readLine();
        System.out.println(input); 
    }
}

위의 코드를 실행시키면 아래와 같이 오류 메세지가 나온다.

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    Unhandled exception type FileNotFoundException
    Unhandled exception type IOException
 
    at org.opentutorials.javatutorials.exception.CheckedExceptionDemo.main(CheckedExceptionDemo.java:5)

Unhandled exception type FileNotFoundException

이것은 아래 로직에 대한 예외처리가 필요하다는 뜻이다. FileReader라는 클래스를 API문서에서 찾아보자. FileReader의 생성자를 문서에서 찾아보면 아래와 같은 부분이 있다.

위의 안내에 따라 바르게 수정된 코드는 아래와 같다.

package org.opentutorials.javatutorials.exception;
import java.io.*;
public class CheckedExceptionDemo {
    public static void main(String[] args) {
        BufferedReader bReader = null;
        String input = null;
        try {
            bReader = new BufferedReader(new FileReader("out.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try{
            input = bReader.readLine();
        } catch (IOException e){
            e.printStackTrace();
        }       
        System.out.println(input); 
    }
}
  1. 다른 사용자에게 예외 던지기

    예외 처리 방법에는 try, catch, finally 뿐만 아니라 throw도 있다. throw를 통해 예외처리를 다음 사용자에게 넘기는 것이다.

    아래 코드를 통해 이해해보자.

    package org.opentutorials.javatutorials.exception;
    

class B{
void run(){
}
}
class C{
void run(){
B b = new B();
b.run();
}
}
public class ThrowExceptionDemo {
public static void main(String[] args) {
C c = new C();
c.run();
}
}


 위 코드를 보면,
  
 class B에 대해서 class C는 사용자 관계에 있다.
 그리고 ThrowExceptionDemo의 main이 C를 사용하고 있다.
 ThrowExceptionDemo의 main은 일반 사용자가 사용하는 것이기에 결국 이 코드의 최종 사용자 즉 소비자(일반 유저, 엔드 유저)에게 예외 처리를 위임하는 구조이다.  

3. 책임의 전가

package org.opentutorials.javatutorials.exception;
import java.io.*;
class B{
void run() throws IOException, FileNotFoundException{
BufferedReader bReader = null;
String input = null;
bReader = new BufferedReader(new FileReader("out.txt"));
input = bReader.readLine();
System.out.println(input);
}
}
class C{
void run() throws IOException, FileNotFoundException{
B b = new B();
b.run();
}
}
public class ThrowExceptionDemo {
public static void main(String[] args) {
C c = new C();
try {
c.run();
} catch (FileNotFoundException e) {
System.out.println("out.txt 파일은 설정 파일 입니다. 이 파일이 프로잭트 루트 디렉토리에 존재해야 합니다.");
} catch (IOException e) {
e.printStackTrace();
}
}
}


 위의 코드를 정리해보면,
 out.txt 파일을 찾을 수 없는 상황은 B.run 입장에서는 어떻게 할 수 있는 일이 아니다. 엔드유저인 애플리케이션의 사용자가 out.txt 파일을 루트 디렉토리에 위치시켜야 하는 문제이기 때문에 애플리케이션의 진입점인 메소드 main으로 책임을 넘기고 있다.
 
 "예외 처리는 귀찮은 일이다. 그래서 예외를 다음 사용자에게 전가(throw)하거나 try...catch로 감싸고 아무것도 하지 않고 싶은 유혹에 빠지기 쉽다. 하지만 예외는 API를 사용하면서 발생할 수 있는 잠재적 위협에 대한 API 개발자의 강력한 암시다. 이 암시를 무시해서는 안 된다. 물론 더욱 고민스러운 것은 예외 처리 방법에 정답이 없다는 것이겠지만 말이다."
 
  위는 생활코딩님의 말씀이다. 잊지말자.
profile
꿈을 이루는 사람

0개의 댓글