Skip to content

Commit

Permalink
Merge pull request #8 from Wannabe-Woowa-Article/llqqssttyy
Browse files Browse the repository at this point in the history
  • Loading branch information
lurgi authored Jun 9, 2024
2 parents 1fb7029 + 18ee005 commit cede296
Showing 1 changed file with 123 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# [try-catch 질문 λ•Œλ¬Έμ— λ©΄μ ‘μ—μ„œ νƒˆλ½ν–ˆλ‹€](https://medium.com/@haiou-a/because-of-a-question-about-try-catch-i-failed-my-interview-2cea0225820c)

### πŸ—“οΈ λ²ˆμ—­ λ‚ μ§œ: 2024.06.03

### 🧚 λ²ˆμ—­ν•œ 크루: λ ›μ„œ(김닀은)

<br/>

---

`try...catch`λŠ” μ½”λ“œ λΈ”λ‘μ˜ 였λ₯˜λ₯Ό μž‘μ„ λ•Œ 주둜 μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— 맀우 μΉœμˆ™ν•˜κ²Œ λŠκ»΄μ§€κ³ , 저도 κ½€ 자주 μ‚¬μš©ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, 싀은 `try...catch`에 λŒ€ν•œ 지식이 λΆ€μ‘±ν–ˆκΈ° λ•Œλ¬Έμ— μ˜λ„μΉ˜ μ•Šκ²Œ 이런 κΈ°λ³Έ κ°œλ…μ„ λ©΄μ ‘μ—μ„œ λ°°μ› μŠ΅λ‹ˆλ‹€.: `try...catch`λŠ” 동기 μ½”λ“œ λΈ”λŸ­μ—μ„œλ§Œ μ—λŸ¬λ₯Ό μž‘μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ§ˆλ¬Έμ€ λ‹€μŒκ³Ό κ°™μ•˜μŠ΅λ‹ˆλ‹€: λ‹€μŒ μ½”λ“œμ— λ¬Έμ œκ°€ μžˆλ‚˜μš”? κ·Έλ ‡λ‹€λ©΄ μ–΄λ–»κ²Œ μˆ˜μ •ν•΄μ•Ό ν•˜λ‚˜μš”?

<br/>

```js
try {
setTimeout(() => {
throw new Error('err');
}, 200);
} catch (err) {
console.log(err);
}

try {
Promise.resolve().then(() => {
throw new Error('err');
});
} catch (err) {
console.log(err);
}
```

<br/>

'`try...catch` μžμ²΄λŠ” 동기 블둝이기 λ•Œλ¬Έμ— 비동기 μ—λŸ¬λ₯Ό μž‘μ„ 수 μ—†λ‹€.'.기본적으둜 μ €λŠ” 이 지점을 λͺ°λžκΈ° λ•Œλ¬Έμ— 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ μ•Œμ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 이 μ§ˆλ¬Έμ„ λ“€μ—ˆμ„ λ•Œ ν˜Όλž€μŠ€λŸ¬μ› μŠ΅λ‹ˆλ‹€.

였λ₯˜λ₯Ό 작기 μœ„ν•΄ `try...catch`λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μš°λ¦¬κ°€ 일반적으둜 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 방식이 μ•„λ‹Œκ°€μš”? κ·Έλž˜μ„œ μ €λŠ” κ·Έλƒ₯ λͺ¨λ₯Έλ‹€κ³  λŒ€λ‹΅ν–ˆκ³  였λ₯˜κ°€ μ—†λ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€... 면접관은 무λ ₯ν•œ ν‘œμ •μœΌλ‘œ μ €λ₯Ό 쳐닀보며 λ‚˜μ€‘μ— 찾아보라고 μ œμ•ˆν–ˆκ³ , 그게 λμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

λΉ λ₯΄κ²Œ μ‘°μ‚¬ν•œ κ²°κ³Ό `try...catch`λŠ” 비동기 μ½”λ“œμ˜ 였λ₯˜λ₯Ό 포착할 수 μ—†λ‹€λŠ” 사싀을 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

**JavaScriptμ—μ„œ setTimeout은 비동기 ν•¨μˆ˜μ΄λ©°, ν•΄λ‹Ή 콜백 ν•¨μˆ˜λŠ” μ§€μ •λœ 지연 ν›„ 이벀트 큐에 배치되고 ν˜„μž¬ μ‹€ν–‰ μŠ€νƒμ΄ μ§€μ›Œμ§„ ν›„μ—λ§Œ μ‹€ν–‰λ©λ‹ˆλ‹€.**

λ”°λΌμ„œ setTimeout 콜백이 μ‹€ν–‰λ˜μ–΄ 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ try...catchλŠ” 이미 싀행이 μ™„λ£Œλ˜μ–΄ 비동기 콜백의 였λ₯˜λ₯Ό μž‘μ„ 수 μ—†μŠ΅λ‹ˆλ‹€.

μ˜¬λ°”λ₯Έ μ ‘κ·Ό 방식은 비동기 μž‘μ—… λ‚΄μ—μ„œ 직접 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 콜백 ν•¨μˆ˜, Promise λ˜λŠ” try...catch와 κ²°ν•©λœ async/await을 μ‚¬μš©ν•˜λŠ” 것 말이죠.

<br/>

```js
new Promise((resolve, reject) => {
setTimeout(() => {
try {
throw new Error('err');
} catch (err) {
reject(err);
}
}, 200);
})
.then(() => {
// μ˜ˆμƒλŒ€λ‘œ μ‹€ν–‰λ˜μ—ˆμ„ λ•Œ μˆ˜ν–‰λ  둜직
})
.catch((err) => {
console.log(err); // μ—λŸ¬λŠ” μ—¬κΈ°μ„œ μž‘νž™λ‹ˆλ‹€
});
```

<br/>

---

<br/>

두 번째 μ˜ˆμ‹œμ˜ 경우, `try...catch`λ₯Ό μ‚¬μš©ν•΄ ν”„λ‘œλ―ΈμŠ€ μ²΄μΈμ—μ„œ λ°œμƒν•œ 였λ₯˜λ₯Ό μž‘μœΌλ €λŠ” μ‹œλ„λ„ λΉ„νš¨μœ¨μ μž…λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ `try...catch`λŠ” ν”„λ‘œλ―ΈμŠ€ 체인 λ‚΄μ—μ„œ 비동기 였λ₯˜λ₯Ό μž‘μ„ 수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

ν”„λ‘œλ―ΈμŠ€ κ°μ²΄λŠ” 비동기 μž‘μ—…μ˜ μ΅œμ’… μ™„λ£Œ(λ˜λŠ” μ‹€νŒ¨)와 κ·Έ κ²°κ³Ό 값을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. ν”„λΌλ―ΈμŠ€μ˜ μƒνƒœλŠ” λ‹€μŒ 쀑 ν•˜λ‚˜μΌ 수 μžˆμŠ΅λ‹ˆλ‹€:

- Pending(λŒ€κΈ° μƒνƒœ): 초기 μƒνƒœ, μ΄ν–‰λ˜μ§€λ„ κ±°λΆ€λ˜μ§€λ„ μ•Šμ€ μƒνƒœ.
- Fulfilled(μ™„λ£Œλœ μƒνƒœ): μž‘μ—…μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
- Reject(μ‹€νŒ¨ μƒνƒœ): μž‘μ—…μ΄ μ‹€νŒ¨ν–ˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

ν”„λ‘œλ―ΈμŠ€μ—μ„œ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λ©΄(예: throw 문을 톡해) ν”„λ‘œλ―ΈμŠ€κ°€ κ±°λΆ€(λ˜λŠ” μ‹€νŒ¨)λ©λ‹ˆλ‹€. 이 μ—λŸ¬λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•˜λ €λ©΄ ν”„λΌλ―ΈμŠ€ μ²΄μΈμ—μ„œ `.catch` λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ 비동기 ν•¨μˆ˜μ—μ„œ `try...catch`λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

<br/>

```js
// λ©”μ„œλ“œ 1
Promise.resolve()
.then(() => {
throw new Error('err');
})
.catch((err) => {
console.log(err); // μ—λŸ¬λŠ” μ—¬κΈ°μ„œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
});

// λ©”μ„œλ“œ 2
async function handleError() {
try {
await Promise.resolve().then(() => {
throw new Error('err');
});
} catch (err) {
console.log(err); // μ—λŸ¬λŠ” μ—¬κΈ°μ„œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
}
}

handleError();
```

<br/>

### >> κ²°λ‘ 

μœ„μ˜ μ‚¬λ‘€μ—μ„œ `try...catch` κ΅¬μ‘°λŠ” 비동기 μ½”λ“œμ—μ„œ 였λ₯˜λ₯Ό 포착할 수 μ—†λ‹€λŠ” 것을 이해해야 ν•©λ‹ˆλ‹€.

비동기 연산을 λ‹€λ£° λ•ŒλŠ” Promiseμ—μ„œ `.catch` λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ `async/await` ꡬ쑰 λ‚΄μ—μ„œ `try...catch`λ₯Ό μ‚¬μš©ν•˜μ—¬ 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ“± μ μ ˆν•œ 였λ₯˜ 처리 λ©”μ»€λ‹ˆμ¦˜μ„ μ±„νƒν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

이 μ ‘κ·Ό 방식은 비동기 μž‘μ—… 쀑에 λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έλ₯Ό 효과적으둜 ν¬μ°©ν•˜κ³  μ²˜λ¦¬ν•  뿐만 μ•„λ‹ˆλΌ μ½”λ“œμ˜ 견고성과 μœ μ§€λ³΄μˆ˜μ„±μ„ 보μž₯ν•©λ‹ˆλ‹€.

일상적인 개발 μž‘μ—…μ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„ λ©”μ»€λ‹ˆμ¦˜κ³Ό 비동기 ν”„λ‘œκ·Έλž˜λ° λͺ¨λΈμ— λŒ€ν•œ μ΄ν•΄λŠ” 개인의 컀리어 μ„±μž₯에 μ€‘μš”ν•œ 역할을 ν•˜λ―€λ‘œ μ˜μ‹μ μœΌλ‘œ 탐ꡬ해야 ν•©λ‹ˆλ‹€.

0 comments on commit cede296

Please sign in to comment.