구구구구우
1k
2015-04-27 16:09:50
4
2690

질문:파일 입출력 올바른 예외처리 방법


public String printFile() {
File file = new File("경로//파일이름.txt");
String text ="저장할 내용";
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
bw.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return file.getPath();
}
보통 파일 입출력 시에 위와 같은 방식으로 예외처리를 하는 걸로 알고 있습니다.
특히 finally구문을 두어 출력스트림이 어떠한 상황에서라도 close되도록 하고 있고
출력 스트림을 닫는 코드에서도 bw.close() 예외가 발생할수 있기 때문에 다시 예외처리를 해야하는것이 가장 올바른 예외처리 방법이라고 알고 있습니다.

제가 궁금한 것은 파일을 출력하는 printFile()메소드 밖(throws)에서 예외를 핸들링 하는경우에 어떻게 해야 위와 동일한(즉 올바른 예외처리) 코드가 되는지가 궁금합니다. 
즉 아래와 같은 상황입니다. 파일을 출력하는 printFile()메소드가 파일을 출력하고 출력한 파일의 경로를 리턴 합니다. 그리고 리턴된 경로를 매개변수로 하는 addNode()가 실행이되는 코드인데
예외가 발생한경우 printFile()가 throws하면 그것을 받아 예외처리를 하고 addNode()가 실행이 되지 않는코드를 작성하려는게 저의 목적이며 더불어 올바른 예외처리를 하기를 원하는겁니다.
즉 올바른 예외처리 결과로 볼수있는 bw(=출력스트림)가 close되는것을 보장받는 코드를 작성하고 싶습니다.  아래에 제가 생각한 예를 늘여놓았는데 확신이 없어 이렇게 질문드립니다.
try {
Path filePath = printFile();
addNode(filePath, Tree);
} catch (IOException e) {
e.printStackTrace();
}
///// 첫번째 예 //////
public Path printFile() throws IOException {
File file = new File("경로//파일이름.txt");
String text ="저장할 내용";
BufferedWriter bw = null;
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
bw.write(text);              // 이코드의 경우 bw.close()의 호출을 보장받지 못한다고 생각하빈다.
bw.close();
return file.toPath();
}

///// 두번째 예 //////
public Path printJava() throws IOException {
File file = new File("경로//파일이름.txt");
String text = "저장할 내용";
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
bw.write(text);
} catch (IOException e) {
throw e;     // 이렇게 예외를 던지면 가능할꺼라 생각하는데
} finally {            // 던지고 나면 finally구문이 실행되는지 잘 몰라서 확신이 안섭니다
try {
if (bw != null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
throw e;                     // 또 bw(출력스트림)을 닫을때 발생하는 예외 또한 throw 해야
}                                        // 하는건지, 아니면 하지 말아야 하는건지 잘 모르겠습니다.
}
return file.toPath();
}


0
  • 답변 4

  • fx
    1k
    2015-04-27 16:29:21

    예외를 던지더라도 final 구문은 정상적으로 실행됨으로 두번째쪽을 추천합니다.

  • 구구구구우
    1k
    2015-04-27 16:37:35
    답변 감사합니다.  
    // 또 bw(출력스트림)을 닫을때 발생하는 예외 또한 throw 해야
     // 하는건지, 아니면 하지 말아야 하는건지 잘 모르겠습니다.
    -> 여기에 대한 답도 해주세요 

    그리고 찾아보니까 이런식의 코드가 있더라구여 이것도 올바른 사용이 맞나요?? 문제만 없다면 이코드가 코드라인도 줄이고 효율적이게 보이는데 
    public Path printFile() throws IOException {
    File file = new File("경로//파일이름.txt");
    String text = "저장할 내용";
    BufferedWriter bw = null;
    try {
    bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
    bw.write(text);
    } finally {
    if (bw != null) {
    bw.close();
    }
    }
    return file.toPath();
  • 우띠
    463
    2015-04-27 16:46:08

    --> 또 bw(출력스트림)을 닫을때 발생하는 예외 또한 throw 해야 하는 건지

    처리하실게 아니시라면 throw 안하셔도 됩니다.


    위 댓글의 코드를 사용하셔도 무방합니다.

  • 구구구구우
    1k
    2015-04-27 16:50:41

    // fx, 우띠 

    - 답변 감사합니다. 

  • 로그인을 하시면 답변을 등록할 수 있습니다.