์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ api ํต์ ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค.
์ด๋ก ์ธํด ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ๋ง์ด ์์ฑํ๋ค ๋ณด๋ ๋ฌธ๋ ์๋์ ๊ฐ์ ์๋ฌธ์ด ์๊ฒผ์ต๋๋ค.
์๋ฌ๊ฐ ๋ง์ฝ ์ค์ฒฉ๋ ํจ์์์ ์ผ์ด๋๊ณ ์ธ๋ถ ํจ์์์ try catch ๋ฌธ์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด๋ ์๋ฌ๋ฅผ ์ก์๋ผ ์ ์์๊น?
์๋ฌ๋ ๋ฌด์์ด์ง?...์.....๋ฌ!? ๐ ์๋ฌ์ ๋ํด ๊ณต๋ถํด ๋ด์ผ๊ฒ ๊ตฐ..!
์๋ฌ์ ๋ํด ๊ณต๋ถ๋ฅผ ๊ฒฐ์ฌํ๊ณ ์ด๋ฒ ๊ธฐํ์ ์ ๋ฆฌํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ฆฌ๋ ๋ด์ฉ์
์ ์ฒ๋ผ ์๋ฌ ์ฒ๋ฆฌ์ ๋ํด ์ด๋ ค์ ํ์ ๋ถ๋ค์ ์ํด ๊ธ์ ์์ฑํ๊ฒ ๋์์ต๋๋ค.
์ด ๊ธ์์ ์ ์ ์๋ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์๋ฌ๊ฐ ๋ฐ์ํ ์์ ์ call stack์ ๊ทธ๋ฆฌ๋ฉด ํด๊ฒฐ๋ฒ์ ์ฐพ์ ์ ์์ต๋๋ค.
๋จผ์ ์๋ฌ(error)๋ ๋ฌด์์ผ๊น์?
์๋ฌ๋ ํ๋ก๊ทธ๋๋ฐ ์ ์๊ธฐ์น ๋ชปํ ์ํฉ์ด ๋ฐ์ํด ํ๋ก๊ทธ๋จ์ ๋ ํฐ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์๊ธฐ ์ํด ๋ฐ์๋๋ ๊ฒ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์๋ 2๊ฐ์ง ์ํฉ์์ ์๋ฌ๊ฐ ๋์ ธ์ง๋๋ค.
๋๋ฒ์ฌ ๋ฐฉ๋ฒ์ธ ๊ฐ๋ฐ์๊ฐ ์๋ฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
new Error(message, option)
์์ ๊ธฐ๋ณธ error constructor๋ฟ๋ง ์๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ๊ณตํ๋ ์ถ๊ฐ์ ์ธ constructors๋ค์ด ์์ต๋๋ค.
์ํ๋ custom ์๋ฌ๋ฅผ ๋ง๋๋ ์์ธํ ๋ฐฉ๋ฒ์ ๋งํฌ๋ฅผ ํ์ธํด์ฃผ์ธ์!
๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด main.js ์์ foo ํจ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ foo ํจ์ ์์์ fee ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
๋ง์ฝ fee์์ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ foo ๋์
foo๋ฅผ ํธ์ถํ main.js์์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
//main.js
function foo() {
function fee() {
throw new Error("error is made in fee");
}
fee();
}
try {
foo();
} catch (e) {
console.log(e.message);
}
์ ์ฝ๋๋ฅผ ์คํํ๊ณ ๋๋ฉด
error is made in fee
error๋ฅผ main.js์ catch ๋ฌธ์์ ์๋ฌ๋ฅผ ํธ๋ค๋ง ํ ๊ฒ์ ํ์ธ ํ ์ ์์ต๋๋ค.
์ ๊ณผ์ ์ ํจ์ call stack์ผ๋ก ๋์ํ๋ฅผ ํด๋ณด๋ฉด ๋ค์ ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ต๋๋ค.
(1) ์์ฒ๋ผ try block ์์์ foo๊ฐ ํธ์ถ๋ฉ๋๋ค.
(2) ํธ์ถ๋ ํจ์ foo ์์์ ํจ์ fee๊ฐ ํธ์ถ๋ฉ๋๋ค.
(3) ํธ์ถ๋ ํจ์ fee ์์ throw new Error("error is made in fee"); ๋ฅผ ์คํํฉ๋๋ค.
์ด๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ฝ๋๊ฐ try๋ก ๊ฐ์ธ์ง call stack ๋ด์์ ์คํ๋์๊ธฐ์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
(4) error๋ฅผ ์ฒ๋ฆฌํ๋ catch ๋ฌธ์ ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค.
์๋ฌ๋ฅผ ๋ฐ์ํ ๊ฒ์ด ์ค์ฒฉ๋ ํจ์์์ ์คํ๋์์ง๋ง.
์ฌ์ค์ ๊ฐ์ ํ๋์ call stack์์ ์์ฌ ์คํ๋ฉ๋๋ค.
์ด๋ก ์ธํด ์ค์ฒฉ๋ ํจ์์์ ๋ฐ์ํ error์ ๊ฒฝ์ฐ ๋ฐ์์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ์ฌ๋
์๋ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๊ฒฐ๊ตญ ์ค์ํ ์ฌ์ค์ ์๋ฌ๋ฅผ ๋ฐ์ํ๋ ํจ์์ ์์น๊ฐ ์ค์ํ ๊ฒ ์๋๋ผ
์๋ฌ๊ฐ ๋ฐ์ํ๋ ์์ ์ call stack์ด ์ค์ํจ์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ง์ฝ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๋ ๊น์?
function foo() {
function feePromise() {
return Promise.reject(new Error("error made in feePromise"));
}
feePromise();
}
try {
foo()
} catch (e) {
console.log(e.message)
}
๋ค์๊ณผ ๊ฐ์ด main.js์์ fooํจ์๊ฐ ์์ต๋๋ค.
๋๊ธฐ์์ผ๋ก ์คํ๋๋ fooํจ์
๊ทธ ์์ Promise๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ feePromiseํจ์๊ฐ ์์ต๋๋ค.
main.js์์ ์์ ์์์ฒ๋ผ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ ํจ์ foo๋ฅผ try๋ฌธ์์ ํธ์ถํ๊ณ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
Uncaught (in promise) Error: error made in feePromise
์์ฒ๋ผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ๋ ์๋ฌ๋ฅผ try catch๋ฌธ์ผ๋ก ์ก์๋ด์ง ๋ชปํ์ต๋๋ค.
์ ์ก์๋ด์ง ๋ชปํ์๊น์?
์ก์๋ด์ง ๋ชปํ ์ด์ ๋ฅผ call stack ๊ด์ ์์ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
์๋ ๊ทธ๋ฆผ์ ํ์ธํด ๋ณด์ธ์
(1) ์ฒซ ๋ฒ์งธ๋ก ๋๊ธฐ์ ์ธ ํจ์ foo๊ฐ ํธ์ถ์ด ๋ฉ๋๋ค. [๋๊ธฐ ์์]
(2) feePromise๊ฐ try ๋ฌธ์ผ๋ก ๊ฐ์ธ์ง call stack ์์์ ์คํ์ด ๋ฉ๋๋ค.
(3) Promise.reject๊ฐ ๋ฐํ์ด ๋ฉ๋๋ค. [๋น๋๊ธฐ]
(4) ์ํ๊ฐ rejected์ธ ๋ฐํ๋ Promise๊ฐ microTaskQueue์ ์ถ๊ฐ๊ฐ ๋ฉ๋๋ค. [๋น๋๊ธฐ]
(5) try ๋ฌธ์ผ๋ก ์คํ๋ call stack์ด ๋ชจ๋ ํธ์ถ๋์ด ์ข
๋ฃ๊ฐ ๋ฉ๋๋ค. [๋๊ธฐ ์ข
๋ฃ]
(6) ๋ ์ด์ ์คํ์ํฌ call stack์ด ์๊ธฐ์ microTaskQueue์ ์๋ Promise๊ฐ ํธ์ถ๋ฉ๋๋ค.
(7) Error๊ฐ ๋ฐ์๋์์ง๋ง try catch ๋ธ๋ก ๋ด์์ ์คํ๋์ง ์์๊ธฐ์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ณ ์ข
๋ฃ๋ฉ๋๋ค.
์์์ ๋ฌธ์ ๊ฐ ๋ ๋ถ๋ถ์ ๋ฐ๋ก 5๋ฒ: try๋ฌธ์ผ๋ก ์คํ๋ call stack์ด ๋ชจ๋ ํธ์ถ๋์ด ์ข
๋ฃ๊ฐ ๋ฉ๋๋ค. ๊ณผ [๋๊ธฐ ์ข
๋ฃ]
7๋ฒ: Error๊ฐ ๋ฐ์๋์์ง๋ง try catch ๋ธ๋ก ๋ด์์ ์คํ๋์ง ์์๊ธฐ์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ณ ์ข
๋ฃ๋ฉ๋๋ค. [๋น๋๊ธฐ ์ฝ๋ ์คํ]
๋ถ๋ถ ์
๋๋ค.
์ฆ ๋๊ธฐ์ ์ผ๋ก ์คํ๋ try catch๋ ๋น๋๊ธฐ ์ ์ผ๋ก ์คํ๋๋ ์ฝ๋๋ณด๋ค ๋จผ์ ์คํ๋๊ณ ์ข ๋ฃ๋๊ธฐ์ ๋น๋๊ธฐ ์ ์ผ๋ก ๋ฐ์ํ ์๋ฌ๋ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ง๊ธ๊น์ง call stack๊ด์ ์์ ๋ณธ๋ค๋ฉด
๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ ์๋ฌ๋ ๋น๋๊ธฐ ์ ์ผ๋ก ์คํ๋๋ call stack์์ ์ฒ๋ฆฌํด์ฃผ๋ฉด๋ฉ๋๋ค.
๋น๋๊ธฐ์ ์ผ๋ก ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
Promise๊ฐ ๋ฐํ๋๋ ํจ์๋ฅผ ํธ์ถํ ๋ .catch๋ก ์ฒ๋ฆฌํด์ฃผ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
async ํจ์ ์์์ Promise๋ฅผ ๋ฐํ๋๋ ํจ์๋ฅผ await์ผ๋ก ํธ์ถํ๊ณ ์ด๋ฅผ try catch๋ก ์ฒ๋ฆฌํด์ค๋๋ค.
function foo() {
function feePromise() {
return Promise.reject(new Error("error made in feePromise"));
}
feePromise()
.then(res => console.log(res))
.catch(err => console.log(err.message));
}
foo()
console.log('๋๊ธฐ์ ์ฝ๋ is done')
์์ฒ๋ผ feePromise()๋ฅผ ํธ์ถํ ๋ถ๋ถ์ .catch๋ฅผ ํ์ฉํ๋ฉด ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์๋ฅผ call stack ๊ด์ ์ผ๋ก ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
(1) foo๊ฐ ์คํ๋ฉ๋๋ค.
(2) feePromise๊ฐ ์คํ๋ฉ๋๋ค.
(3) Promise๊ฐ ๋ฐํ๋๊ณ . microTaskQueue์ ์ถ๊ฐ๋ฉ๋๋ค.
์ด๋ Promise์๋ ํ์ error๊ฐ ๋ฐ์ํ ๋ ์ฒ๋ฆฌํ ์ ์๋ catch ๋ฌธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
(4) foo ํจ์๊ฐ ์ข
๋ฃ๋๊ณ ๋๊ธฐ์ ์ฝ๋ ์ข
๋ฃ๋ฅผ ์๋ฆฌ๋ console.log๊ฐ ์คํ๋ฉ๋๋ค.
(5) call stack์ด ๋น์ด์๊ธฐ์ microTaskQueue์ ์๋ Promise๊ฐ call stack์ผ๋ก ์ด๋ํฉ๋๋ค.
(6) call stack์์ then์์ ์คํ๋ (res) => console.log(res)๋ฅผ ์คํํ๊ธฐ ์ Error๊ฐ ๋ด๊ธด Promise๋ฅผ ๋ฐํํฉ๋๋ค.
(7) ์ด๋ ์์ฑํ๋ .catch๋ก ๋ฐ์๋ ์๋ฌ๋ฅผ ์ก์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ microTaskQueue์ ๋ฐํํฉ๋๋ค.
(8) call stack์ด ๋น์ด์๊ธฐ์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ (err) => console.log(err.message)๋ฅผ ๋ถ๋ฌ์ค๊ณ ์คํ์ํต๋๋ค.
(9) ์ฝ์์ฐฝ์ error is made in fee๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค.
async function foo() {
function feePromise() {
return Promise.reject(new Error("error made in feePromise"));
}
try {
await feePromise()
} catch(e) {
console.log(e.message)
}
}
foo()
console.log('๋๊ธฐ์ ์ฝ๋ is done')
foo๋ฅผ async ํจ์๋ก ๋ฐ๊พธ๊ณ feePromise๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ await์ผ๋ก ํธ์ถํฉ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด feePromise๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ๋ถํฐ ๋น๋๊ธฐ์ ์ผ๋ก ์ฝ๋๊ฐ ์คํ์ด ๋ฉ๋๋ค.
๋น๋๊ธฐ ์ ์ผ๋ก ์ฝ๋๋ฅผ ์คํํ๋ ๋ถ๋ถ์ try catch ๋ด์์ ์คํํ๊ฒ ๋๋ฉด ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ
์๋ฌ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํ๋ฒ call stack ๊ด์ ์์ ๋์ํ ํด๋ณด๊ฒ ์ต๋๋ค.
(1) foo๋ฅผ async ํจ์๋ฅผ ๋ง๋ค๊ณ ํธ์ถ์ ํฉ๋๋ค.
(2) await์ผ๋ก Error๋ฅผ ๋ด์ Promise๋ฅผ ๋ฐํํ๋ feePromise๋ฅผ ํธ์ถํฉ๋๋ค.
(3) await์ผ๋ก ํธ์ถํ์๊ธฐ์ feePromise๋ฅผ ํธ์ถํ๊ณ Promise๋ฅผ ๋ฐํํ๊ธฐ์ foo๋ ๋น๋๊ธฐ์์ผ๋ก ์๋์ ํฉ๋๋ค. ๋ฐ๋ผ์ microTaskQueue๋ก foo๋ ๋์ด๊ฐ๋๋ค.
(4) ์ดํ console.log('๋๊ธฐ์ ์ฝ๋ is done') ์ด ์คํ๋๋ฉด์ ๋๊ธฐ์์ผ๋ก ์คํ๋๋ ์ฝ๋๊ฐ ์ข
๋ฃ๋ฉ๋๋ค.
(5) ๋๊ธฐ์ ์ผ๋ก ์คํ๋ call stack์ด ๋ง๋ฌด๋ฆฌ๊ฐ ๋์ด ๋น์๊ธฐ์ microTaskQueue์ ์๋ ํจ์ foo๊ฐ ๋ค์ call stack์ผ๋ก ์ฌ๋ผ๊ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ Error๋ฅผ ๋ฐํํ๋ Promise๊ฐ ์คํ๋ฉ๋๋ค.
(6) ์ด๋ try catch๋ฌธ์ด ๋ฐํ๋ Error๋ฅผ ์ก๊ณ console.log(e.message)๊ฐ ์คํ๋ฉ๋๋ค.
(7) ์ด๋ก ์ธํด error is made in fee๊ฐ ์ฝ์ ์ฐฝ์ ์ถ๋ ฅ๋ฉ๋๋ค.
(8, 9) ์ดํ์ ํจ์ foo๊ฐ ๋ง๋ฌด๋ฆฌ ๋์ด call stack์ ๋น์๋
๋๋ค.
์ง๊ธ๊น์ง ๋น๋๊ธฐ๋ก ๋ฐ์ํ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์์ต๋๋ค.
๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ ์๋ฌ๋ ๋น๋๊ธฐ์ ์ธ ์ฝ๋๊ฐ ์คํ๋ ๋ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ๋ก Promise๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ํธ์ถํ ๋ .catch๋ฅผ ํ์ฉํด์ ์๋ฌ๋ฅผ ์ก์๋
๋๋ค.
๋ ๋ฒ์งธ๋ก Promise๋ฅผ ํธ์ถํ๋ ํจ์๋ฅผ async๋ก ํจ์๋ก ์ ์ธํ๊ณ Promise๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ await์ผ๋ก ํธ์ถํ๊ณ try catch ๋ฌธ์ ํ์ฉํ๋ฉด ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ด๋ฒ ์๊ฐ์ ์๋ฌ์ ๋ํด์ ์์๋ณด๊ณ ๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ ์๋ฌ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ฐ๊ฐ ์์๋ณด์์ต๋๋ค.
๊ฒฐ๊ตญ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๋ถ๋ถ์ด ์ด๋ ์์น์์ ์ ์ธ๋ ๊ฒ๋ณด๋จ ์๋ฌ๊ฐ call stack ๊ด์ ์์ ์ด๋ ์์ ์ ๋ฐ์ํ๋์ง๊ฐ ์ค์ํจ์ ์๊ฒ ๋์์ต๋๋ค.
call stack๊ด์ ์ผ๋ก ๋ถ์ํ๋ฉด ๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ ์๋ฌ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํด์ผํ๋ ๋ถ๋ถ์ ์ฝ๊ฒ ๋ถ์ํ ์ ์์ต๋๋ค.
๋ง์ฝ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ํฉ์ด ์๊ธฐ๊ฒ ๋๋ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ํธ์ถ call stack์ ๊ทธ๋ ค์ ๋ถ์ํด ๋ณธ๋ค๋ฉด ๊น๋ค๋กญ๊ธฐ๋ง ํ๋ ์๋ฌ๊ฐ ํ๋ก๊ทธ๋จ์ ์ง์ผ์ฃผ๋ ์ข์ ์ํธ์๊ฐ ๋ ๊ฒ์ ๋๋ค.
์ง๊ธ๊น์ง ๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
error์ ๋ํ ์ ๋ณด
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Error
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
javascript callstack ์๊ฐํ
https://dev.to/lydiahallie/javascript-visualized-promises-async-await-5gke
error ์ฒ๋ฆฌ ๊ด๋ จ ์ข์๊ธ
https://kinsta.com/blog/errors-in-javascript/