finally 아니면 코드만?
중요도: 5
두 코드 조각을 비교해보세요.
-
첫 번째 코드 조각은
try..catch
이후에 코드를 실행하기 위해finally
를 사용하였습니다.try { 작업 } catch (e) { 에러 핸들링 } finally { 작업 내역 삭제 }
-
두 번째 코드 조각에선
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
의 끝에 붙였다면, 위와 같은 상황일 때 초기화 코드가 실행되지 않습니다.