πŸ“‹ λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive | 47μž₯ μ—λŸ¬ 처리

waterglassesΒ·2022λ…„ 9μ›” 3일
0
post-thumbnail

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive λ„μ„œμ˜ 47μž₯ μ—λŸ¬ 처리λ₯Ό μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

47.1 μ—λŸ¬ 처리의 ν•„μš”μ„±

μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ‹€. try... catch 문을 μ‚¬μš©ν•΄ λ°œμƒν•œ μ—λŸ¬μ— μ μ ˆν•˜κ²Œ λŒ€μ‘ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ κ°•μ œ μ’…λ£Œλ˜μ§€ μ•Šκ³  κ³„μ†ν•΄μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¬ 수 μžˆλ‹€.

// 47-01
console.log('[start]');

try {
  foo();
} catch (error) {
  console.log('[μ—λŸ¬ λ°œμƒ]', error);
  // [μ—λŸ¬ λ°œμƒ] ReferenceError: foo is not defined
}

// λ°œμƒν•œ μ—λŸ¬μ— μ μ ˆν•œ λŒ€μ‘μ„ ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ κ°•μ œ μ’…λ£Œλ˜μ§€ μ•ŠλŠ”λ‹€.
console.log('[End]');

μ˜ˆμ™Έμ μΈ 상황에 μ μ ˆν•˜κ²Œ λŒ€μ‘ν•˜μ§€ μ•ŠμœΌλ©΄ μ—λŸ¬λ‘œ μ΄μ–΄μ§ˆ κ°€λŠ₯성이 크닀.

// 47-03
// DOM에 button μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ querySelector λ©”μ„œλ“œλŠ” μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•Šκ³  null을 λ°˜ν™˜ν•œλ‹€. 
const $button = document.querySelector('button'); null

$button.classList.add('disabled');
// TypeError: Cannot read property 'classList' of null

μœ„ 예제의 querySeletor λ©”μ„œλ“œλŠ” 인수둜 μ „λ‹¬ν•œ λ¬Έμžμ—΄μ΄ CSS μ„ νƒμž 문법에 λ§žμ§€ μ•ŠλŠ” 경우 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

// 47-05
// μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μž `?.`을 μ‚¬μš©ν•΄μ„œ μ—λŸ¬λ₯Ό λ§‰μŒ
const $button = document.querySeletor('button'); // null
$button?.classList.add('disabled');

47.2 try...catch...finally λ¬Έ

μ—λŸ¬ 처리λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법
  1. querySelectorλ‚˜ Array#findλ©”μ„œλ“œμ²˜λŸΌ μ˜ˆμ™Έμ μΈ 상황이 λ°œμƒν•˜λ©΄ λ°˜ν™˜ν•˜λŠ” 값을 if λ¬Έμ΄λ‚˜ 단좕 평가 λ˜λŠ” μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μžλ₯Ό 톡해 ν™•μΈν•΄μ„œ μ²˜λ¦¬ν•˜λŠ” 방법
  2. μ—λŸ¬ 처리 μ½”λ“œλ₯Ό 등둝해 두고 μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ μ—λŸ¬ 처리 μ½”λ“œλ‘œ μ ν”„ν•˜λ„λ‘ ν•˜λŠ” 방법이 μžˆλ‹€.
try {
  // μ‹€ν–‰ν•  μ½”λ“œ(μ—λŸ¬κ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œ)
} catch (err) {
  // try μ½”λ“œ λΈ”λ‘μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ 이 μ½”λ“œ λΈ”λ‘μ˜ μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€.
  // err μ—λŠ” try μ½”λ“œ λΈ”λ‘μ—μ„œ λ°œμƒν•œ Error 객체가 μ „λ‹¬λœλ‹€.
} finally {
  // μ—λŸ¬ λ°œμƒκ³Ό 상관없이 λ°˜λ“œμ‹œ ν•œ 번 μ‹€ν–‰λœλ‹€.
}

47.3 Error 객체

Error μƒμ„±μž ν•¨μˆ˜μ—λŠ” μ—λŸ¬λ₯Ό μƒμ„Ένžˆ μ„€λͺ…ν•˜λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 인수둜 전달할 수 μžˆλ‹€.

const error = new Error('invalid');

Error μƒμ„±μž ν•¨μˆ˜κ°€ μƒμ„±ν•œ μ—λŸ¬ κ°μ²΄λŠ” message ν”„λ‘œνΌν‹°μ™€ stack ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ”λ‹€. message ν”„λ‘œνΌν‹°μ˜ 값은 Error μƒμ„±μž ν•¨μˆ˜μ— 인수둜 μ „λ‹¬ν•œ μ—λŸ¬ λ©”μ‹œμ§€μ΄κ³ , stack ν”„λ‘œνΌν‹°μ˜ 값은 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨ μ½œμŠ€νƒμ˜ 호좜 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄μ΄λ©° 디버깅 λͺ©μ μœΌλ‘œ μ‚¬μš©ν•œλ‹€.

47.4 throw λ¬Έ

μ—λŸ¬ 객체 생성과 μ—λŸ¬ λ°œμƒμ€ μ˜λ―Έκ°€ λ‹€λ₯΄λ‹€.
μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λ €λ©΄ try μ½”λ“œ λΈ”λ‘μ—μ„œ throw 문으둜 μ—λŸ¬ 객체λ₯Ό λ˜μ Έμ•Ό ν•œλ‹€.

throw ν‘œν˜„μ‹;

throw 문의 ν‘œν˜„μ‹μ€ μ–΄λ–€ 값이라도 μƒκ΄€μ—†μ§€λ§Œ γ…‡λ¦¬λ°˜μ μœΌλ‘œ μ—λŸ¬ 객체λ₯Ό μ§€μ •ν•œλ‹€. μ—λŸ¬λ₯Ό λ˜μ§€λ©΄ catch문의 μ—λŸ¬ λ³€μˆ˜κ°€ μƒμ„±λ˜κ³  λ˜μ Έμ§„ μ—¬λŸ¬ 객체가 ν• λ‹Ήλœλ‹€. 그리고 catch μ½”λ“œ 블둝이 μ‹€ν–‰λ˜κΈ° μ‹œμž‘ν•œλ‹€.

47.5 μ—λŸ¬μ˜ μ „νŒŒ

μ—λŸ¬λŠ” 호좜자 λ°©ν–₯으둜 μ „νŒŒλœλ‹€. 즉, 콜 μŠ€νƒμ˜ μ•„λž˜λ°©ν–₯으둜 μ „νŒŒλœλ‹€.

const foo = () => {
  throw Error('fooμ—μ„œ λ°œμƒν•œ μ—λŸ¬'); // 4
}

const bar = () => {
  foo(); // 3
}

const baz = () => {
  bar(); //2
}

try {
  baz() // 1
} catch (err) {
  console.error(err);
}
 

1μ—μ„œ bazν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 2μ—μ„œ barν•¨μˆ˜κ°€ 호좜되고 3μ—μ„œ fooν•¨μˆ˜κ°€ 호좜되고 fooν•¨μˆ˜λŠ” 4μ—μ„œ μ—λŸ¬λ₯Ό throwν•œλ‹€. μ΄λ•Œ fooν•¨μˆ˜κ°€ throwν•œ μ—λŸ¬λŠ” λ‹€μŒκ³Ό 같이 ν˜ΈμΆœμžμ—κ²Œ μ „νŒŒλ˜μ–΄ μ „μ—­μ—μ„œ μΊμΉ˜λœλ‹€.

μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ <- baz μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ <- bar μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ <- foo μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

throw된 μ—λŸ¬λ₯Ό μΊμΉ˜ν•˜μ—¬ 적절히 λŒ€μ‘ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ„ κ°•μ œ μ’…λ£Œμ‹œν‚€μ§€ μ•Šκ³  μ½”λ“œμ˜ μ‹€ν–‰ 흐름을 볡ꡬ할 수 μžˆλ‹€. throw된 μ—λŸ¬λ₯Ό μ–΄λ””μ—μ„œλ„ μΊμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œκ·Έλž¨μ€ κ°•μ œ μ’…λ£Œλœλ‹€.

Ref

  • 이웅λͺ¨ μ €, ⌜λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive⌟, μœ„ν‚€λΆμŠ€
profile
맀 μˆœκ°„ μ„±μž₯ν•˜λŠ” κ°œλ°œμžκ°€ 되렀고 λ…Έλ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€