돌아가기

finally 아니면 코드만?

중요도: 5

두 코드 조각을 비교해보세요.

  1. 첫 번째 코드 조각은 try..catch 이후에 코드를 실행하기 위해 finally를 사용하였습니다.

    try {
      작업
    } catch (e) {
      에러 핸들링
    } finally {
      작업 내역 삭제
    }
  2. 두 번째 코드 조각에선 try..catch 바로 아래에 작업 내역을 삭제하는 코드를 놓았습니다.

    try {
      작업
    } catch (e) {
      에러 핸들링
    }
    
    작업 내역 삭제

현재 상황은 에러의 유무와 상관없이, 작업 후 초기화를 해야합니다.

finally를 사용하면 이점이 있을까요? 아니면 두 코드 조각은 동일하게 동작할까요? 만약 이점이 있다면, 이점이 드러나는 예시를 제시해 주세요.

차이점은 함수 내부의 코드를 보면 분명해집니다.

try..catch에 ‘빠져나오게 하는’ 코드가 있다면 함수의 행동이 달라집니다.

아래 예시와 같이 try..catch 내부에 return이 있을 때가 대표적인 예입니다. finally 절은 return문을 통해 try..catch를 빠져나가는 경우를 포함하여 try..catch가 종료되는 모든 상황에서 실행됩니다. try..catch가 종료되었지만, 함수 호출 코드가 제어권을 갖기 직전에 실행되죠.

function f() {
  try {
    alert('시작');
    return "결과";
  } catch (e) {
    /// ...
  } finally {
    alert('초기화!');
  }
}

f(); // cleanup!

또는, 아래와 같이 throw가 있어도 함수의 행동이 달라집니다.

function f() {
  try {
    alert('시작');
    throw new Error("에러 발생!");
  } catch (e) {
    // ...
    if("에러를 핸들링 할 수 없다면") {
      throw e;
    }

  } finally {
    alert('초기화!')
  }
}

f(); // cleanup!

이렇게 finally 절을 붙여줘야 초기화가 보장됩니다. 작업 내역을 초기화해주는 코드를 단순히 f의 끝에 붙였다면, 위와 같은 상황일 때 초기화 코드가 실행되지 않습니다.