try나 catch문에서 return을 하거나, catch에서 throw를 해도 finally는 무조건 실행이되는 건가 궁금해서 검색을 해보았다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/try...catch
https://webclub.tistory.com/71
검색해보니 finally는 이런 경우에도 항상 실행된다고 한다.
그래서 테스트 해보았다.
let test = () => {
try {
console.log("try");
throw new Error();
} catch (e) {
console.log("catch");
throw e;
} finally {
console.log("finally!!!");
}
};
try {
test();
} catch (e) {
console.log("main");
}
test라는 함수에서 try에서 무조건 에러를 throw하고 이걸 다시 catch에서 throw한다. 여기서 만약에 바로 밖으로 빠져 나간다면 finally 안의 "finally!!!"는 출력되지 않을 것이다.
try
catch
finally!!!
main
결과는 위와 같이 finally!!!도 출력이 되었다.
그리고 try나 catch에서 발생한 에러가 있더라도 finally에서 새로운 에러가 발생하면 이걸로 덮어 씌워진다고 한다.
let test = () => {
try {
throw new Error("try error");
} catch (e) {
throw e;
} finally {
console.log(출력);
}
};
try {
test();
} catch (e) {
console.log(e.message);
}
이렇게 했을 때
출력 is not defined
finally에서 발생한 에러의 메세지가 출력됨을 확인했다.
let test = () => {
try {
return "try"
} catch (e) {
return "catch"
} finally {
return "finally!!!"
}
};
try {
console.log(test())
} catch (e) {
console.log("main");
}
return을 했을 때도 finally는 항상 실행된다고 하였는데 그렇다면 위와 같은 경우엔 어떻게 될까 해보았다.
finally!!!
가 출력되었다.
그리고 그전에 return하려던 것이 있어도 finally에 있던 return으로 덮어쓴다고 한다.