์๋ฌ ํธ๋ค๋ง์ ๋ชฉํ๋ ๋ ๊ฐ์ง๋ค
์๋ฌ ์ฒ๋ฆฌ๋ ๋จ์ํ try / catch๋ฅผ ์ฐ๋ ๋ฌธ์ ๊ฐ ์๋๋ค.
๋ชฉํ๋ ๋ช
ํํ๋ค.
- ๊ฐ๋ฐ์๊ฐ ๋ฌธ์ ๋ฅผ ์ธ์งํ ์ ์๋๊ฐ
- ์ด๋์
- ์
- ์ด๋ค ์๋ฌ๊ฐ ๋ฌ๋์ง
- ์ฌ์ฉ์์๊ฒ ๋น์ ์ ์ํฉ์ ์ ์ ํ ๋ณด์ฌ์ฃผ๋๊ฐ
- ๋ฉ์ท๋ค๋ ์ฌ์ค์ ์๋ ค์ฃผ๋์ง
- ๋ค์ ์๋ํ ์ ์๋์ง
- ์ต์ํ ๋ง๊ฐ์ง ํ๋ฉด์ ์๋์ง
์๋ฌ ์ฒ๋ฆฌ์ ๊ธฐ์ด: throw๋ ์ด๋๊น์ง ์ ํ๋ ๊น?
function foo(s) {
console.log("foo start");
if (typeof s !== 'string') throw '์๋ฌ';
console.log("foo end");
}
function bar() {
console.log("bar start");
foo(1);
console.log("bar end");
}
function baz() {
console.log("baz start");
bar();
console.log("baz end");
}
baz();
์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ด๋๊น์ง ์ถ๋ ฅ๋ ๊น?
- foo end๋ ์คํ๋์ง ์๋๋ค
- bar end, baz end๋ ์คํ๋์ง ์๋๋ค
์๋ฌ๋ ๊ฐ์ฅ ๊ฐ๊น์ด catch๋ฅผ ๋ง๋ ๋๊น์ง ์ฝ์คํ์ ํ๊ณ ์ฌ๋ผ๊ฐ๋ค.
Error ๊ฐ์ฒด๋ก ๋์ ธ์ผ ํ๋ ์ด์
throw new Error("์๋ฌ");
๋ฌธ์์ด ๋์ Error๋ฅผ ๋์ง๋ฉด:
- stack trace๊ฐ ์๊ธฐ๊ณ
- ์ด๋์ ํฐ์ก๋์ง ์ถ์ ์ด ๊ฐ๋ฅํด์ง๋ค
๋๋ฒ๊น ๊ด์ ์์๋ ์ ํ์ด ์๋๋ผ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ๊น๋ค.
์๋ฌ ์ฒ๋ฆฌ๋ ์ด๋์ ํด์ผ ํ ๊น?
๋ชจ๋ ํจ์๊ฐ ์๋ฌ๋ฅผ ์ก์์ผ ํ ๊น?
๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด ์๋๋ค.
์์ ํจ์๋ ๊ตณ์ด ์๋ฌ๋ฅผ ์ก์ง ์๋๋ค
- ์ ๋ ฅ → ์ถ๋ ฅ์ด ๋ช ํํ๊ณ
- ๋ถ์ ํจ๊ณผ๊ฐ ์๋ ํจ์๋
- ์์ ๊ฐ๋ฅํ ๋ฒ์์์๋ง ๋์ํ๋ค
์คํ๋ ค ๊ณผ๋ํ ๋ฐฉ์ด ๋ก์ง์ด ์ฝ๋๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ ๋ค.
์ฌ์ด๋ ์ดํํธ๊ฐ ์๋ ๊ณณ์์ ์ก๋๋ค
- ๋คํธ์ํฌ ์์ฒญ
- ํ์ผ ์์คํ ์ ๊ทผ
- ์ธ๋ถ API ํธ์ถ
์์ธก ๋ถ๊ฐ๋ฅํ ์ง์ ์์ ์๋ฌ ํธ๋ค๋ง์ด ํ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ํ ์์น ํ๋:
ํธ์ถ๋๋ ํจ์๋ ์๋ฌ๋ฅผ ๋์ง๊ณ ,
ํธ์ถํ๋ ์ชฝ์์ ์ฒ๋ฆฌํ๋ค.
๊ทธ๋์ผ ์๋น์ค ๋งฅ๋ฝ์ ๋ง๋ ๋์์ด ๊ฐ๋ฅํ๋ค.
๋๊ธฐ์ ๋น๋๊ธฐ ์๋ฌ๋ ๋ค๋ฅด๊ฒ ๋์ํ๋ค
๋๊ธฐ ์๋ฌ๋ ์ต์ํ๋ค
try {
JSON.parse("{");
} catch (e) {
console.log(e.message);
}
๋ฌธ์ ์๋ค. ๋ฐ๋ก ์กํ๋ค.
๋น๋๊ธฐ์์๋ ์ํฉ์ด ๋ฌ๋ผ์ง๋ค
try {
setTimeout(() => {
JSON.parse("{");
}, 1000);
} catch (e) {
console.log(e.message);
}
์ด ์ฝ๋๋ ์๋ฌ๋ฅผ ์ก์ง ๋ชปํ๋ค.
์ด์ ๋ ๋จ์ํ๋ค.
- setTimeout์ ์ฝ๋ฐฑ์ ๋ฑ๋ก๋ง ํ๊ณ
- ํ์ฌ ์คํ ์ปจํ ์คํธ๋ ์ด๋ฏธ ์ข ๋ฃ๋์๊ธฐ ๋๋ฌธ์ด๋ค
try/catch๋ ๊ฐ์ ์คํ ํ๋ฆ ์์์๋ง ๋์ํ๋ค.
async / await๋ ๋ง๋ฅ์ ์๋๋ค
(async function() {
try {
setTimeout(() => {
throw 'error';
}, 1000);
} catch (e) {
console.log(e);
}
})();
์ฌ์ ํ ์กํ์ง ์๋๋ค.
async๋ Promise๋ฅผ awaitํ ๋๋ง ์๋ฏธ๊ฐ ์๋ค.
๋น๋๊ธฐ ์๋ฌ๋ฅผ ์ก๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ
Promise reject + await
(async function() {
try {
await new Promise((_, reject) =>
setTimeout(() => reject("error"), 1000)
);
} catch (e) {
console.log(e);
}
})();
์ด์ ์กํ๋ค.
- reject → await → catch
- ํ๋์ ํ๋ฆ์ผ๋ก ์ด์ด์ก๊ธฐ ๋๋ฌธ์ด๋ค
๋๋ Promise ์ฒด์ด๋
new Promise((_, reject) =>
setTimeout(() => reject("error"), 1000)
)
.catch(e => {
console.log(e);
});
fetch ์ฌ์ฉ ์ ํํ ์คํด
try {
await fetch("์๋ชป๋ ์ฃผ์");
} catch (e) {
console.log(e);
}
์ด ์ฝ๋๋ ๋คํธ์ํฌ ์๋ฌ์ผ ๋๋ง catch์ ๋ค์ด์จ๋ค.
- 404
- 500
์ด๊ฑด ์๋ฌ๊ฐ ์๋๋ค.
fetch๋ Response ๊ฐ์ฒด๋ฅผ ์ ์์ ์ผ๋ก ๋ฐํํ๋ค.
HTTP ์๋ฌ๋ ์ง์ ์ฒ๋ฆฌํด์ผ ํ๋ค
const res = await fetch(url);
if (!res.ok) {
throw new Error(`HTTP ์ค๋ฅ ๋ฐ์: ${res.status}`);
}
์ด์ ์ผ ๋น๋ก์:
- ๋คํธ์ํฌ ์๋ฌ → catch
- HTTP ์๋ฌ → ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์๋ฌ → catch
์๋น์ค ๋ ์ด์ด์์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ์
async function getData() {
const res = await fetch(url);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}
async function service() {
try {
const data = await getData();
renderPage(data);
} catch (e) {
handleServiceError(e);
}
}
- API ํจ์๋ ํ๋จํ์ง ์๋๋ค
- ์๋น์ค ์ฝ๋๊ฐ “์ด ์๋ฌ๋ฅผ ์ด๋ป๊ฒ ๋ณด์ฌ์ค์ง” ๊ฒฐ์ ํ๋ค
์ด ๊ตฌ์กฐ๊ฐ ์ ์ง๋ณด์์ ๊ฐ์ฅ ์ ๋ฆฌํ๋ค.
์ ๋ฆฌ: ๋น๋๊ธฐ ์๋ฌ๋ ์กฐ์ฉํ ํฐ์ง๋ค
๋น๋๊ธฐ ์๋ฌ์ ๊ฐ์ฅ ๋ฌด์์ด ์ ์ ์ด๊ฑฐ๋ค.
ํฐ์ก๋ค๋ ์ฌ์ค์กฐ์ฐจ ๋ชจ๋ฅผ ์ ์๋ค.
๊ทธ๋์ ํ์ํ ๊ฑด
- ์ด๋์ ์๋ฌ๋ฅผ ๋์ง์ง ์ ํ๋ ๊ธฐ์ค
- ์ด๋์ ์ก์์ง์ ๋ํ ํฉ์
- “์ด ์ํฉ์ ํ ์คํธํด๋ดค๋๊ฐ?”๋ผ๋ ์ง๋ฌธ
์ด๋ค.