프로그래밍 스티치

finally블럭 본문

JAVA/예외처리

finally블럭

프로그래밍 스티치 2022. 2. 9. 21:47
finally블럭

finally블럭은 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용됩니다.

 

try{
	// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception e) {
	// 예외처리를 위한 문장을 적는다.
} finally {
	// 예외의 발생여부에 관계없이 항상 수행되어야 하는 문장들을 넣는다.
    // finally블럭은 try-catch문의 맨 마지막에 위치해야 한다.
}

try-catch문의 끝에 선택적으로 덧붙여 사용가능! 위치는 반드시 마지막 블럭에 고정적이다.

 

try{
	startInstall(); // 설치
    copyFiles();    // 복사
    deleteTempFiles(); // 임시파일 삭제
} catch (Exception e) {
	e.printStackTrace();
    deleteTempFiles();
}

위와 같이 반드시 수행되어야 하는 작업이 있으면 try문과 catch문 모두에 삽입하는 것보다는

try{
	startInstall();
    copyFiles();
} catch (Exception e) {
	e.printStackTrace();
} finally {
	deleteTempFiles();
}

이렇게 finally블럭을 추가해서 코드 중복을 제거해주는 편이 좋다!

 

 

사용자 정의 예외 만들기

기존의 정의된 예외 클래스 외에도 필요에 따라 프로그래머가 새로운 예외 클래스를 정의하여 사용할 수 있다.

예시를 통해 알아보자.

 

class MyException extends Exception {
	MyException(String msg) { // 문자열을 매개변수로 받는 생성자 ( 필히 작성!! ) 
    	super(msg); // 조상인 Exception클래스의 생성자를 호출한다.
	}
}

Exception클래스로부터 상속받아서 MyException클래스를 만들었다. 필요하다면, 멤버변수나 메서드를 추가할 수 있다.

이전의 코드를 조금 개선시켜보자

class MyException extends Exception {
	// 에러 코드 값을 저장하기 위한 필드를 추가 했다.
    private final int ERR_CODE; // 생성자를 통해 초기화 한다.
    
    MyException(String msg, int errCode){ // 생성자
    	super(msg);
        ERR_CODE = errCode;
	}
    
    MyException(String msg) { // 생성자
    	this(msg, 100); // ERR_CODE를 100(기본값)으로 초기화한다.
	}
    
    public int getErrCode() { // 에러 코드를 얻을 수 있는 메서드도 추가했다.
    	return ERR_CODE; // 이 메서드는 주로 getMessage()와 함께 사요ㅕㅇ될 것이다.
	}
}

메시지 뿐만 아니라 에러코드 값도 저장할 수 있도록 ERR_CODE와 getMessage()를 MyException클래스의 멤버로 추가했다. 이렇게 함으로써 MyException이 발생했을 때, catch블럭에서 getMessage()와 getErrCode()를 사용해서 에러코드와 메시지를 모두 얻을 수 있습니다.

 

기존의 예외클래스는 주로 Exception을 상속받아서 'checked예외'로 작성하는 경우가 많았지만, 최근에는 코드의 복잡성을 줄이기 위해 예외 처리를 선택적으로 할 수 있는 RuntimeException을 상속받아서 작성하는 쪽으로 바뀌어 가고 있습니다! 

'JAVA > 예외처리' 카테고리의 다른 글

예외 되던지기(exception re-throwing)  (0) 2022.02.11
메서드에 예외 선언하기  (0) 2022.02.08
예외 발생시키기  (0) 2022.02.08
멀티 catch 블럭  (0) 2022.02.08
try-catch문에서의 흐름  (0) 2022.02.08