λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
javascript/πŸ“– study

[11μ£Όμ°¨ μŠ€ν„°λ””]47μž₯-μ—λŸ¬ 처리

by HomieKim 2022. 4. 8.

μ—λŸ¬ 처리

try ... catch ... finally

  • μ—λŸ¬ 처리 κ΅¬ν˜„ν•˜λŠ” 방법은 크게 두가지

    1. μ˜ˆμ™Έ 적인 상황이 λ°œμƒ μ‹œ λ°˜ν™˜ ν•˜λŠ” 값을 if λ¬Έ, 단좕 평가, μ˜΅μ…”λ„ 체이닝 λ“±μœΌλ‘œ 직접 ν™•μΈν•˜λŠ” 방법
    2. μ—λŸ¬ 처리 μ½”λ“œλ₯Ό 미리 등둝해 두고 μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ μ—λŸ¬ 처리 μ½”λ“œλ‘œ μ ν”„ν•˜λ„λ‘ ν•˜λŠ” 방법
  • try ... catch ... finally λŠ” λ‘λ²ˆ μ§Έ 방법

  • 3개의 μ½”λ“œ λΈ”λ‘μœΌλ‘œ ꡬ성

try {
    // μ‹€ν–‰ ν•  μ½”λ“œ(μ—λŸ¬κ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œ)
} catch (err) { // err λ³€μˆ˜λͺ…은 λ‹€λ₯Έ κ±° 해도 됨
    // try μ½”λ“œ λΈ”λ‘μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ 이 μ½”λ“œ λΈ”λ‘μ˜ μ½”λ“œκ°€ μ‹€ν–‰ λœλ‹€.
    // errμ—λŠ” try μ½”λ“œ λΈ”λ‘μ—μ„œ λ°œμƒν•œ Error 객체가 μ „λ‹¬λœλ‹€.
} finally {
    // μ—λŸ¬ λ°œμƒκ³Ό 상관없이 λ°˜λ“œμ‹œ ν•œ 번 μ‹€ν–‰ 됨
}
  • finally문은 λΆˆν•„μš” ν•˜λ‹€λ©΄ μƒλž΅ κ°€λŠ₯

Error 객체

  • Error μƒμ„±μž ν•¨μˆ˜λŠ” μ—λŸ¬ 객체λ₯Ό 생성
  • Error μƒμ„±μž ν•¨μˆ˜μ—λŠ” μ—λŸ¬ 메세지λ₯Ό 전달 κ°€λŠ₯
const error = new Error('this is Error message');
  • Error κ°μ²΄λŠ” message ν”„λ‘œνΌν‹°μ™€ stack ν”„λ‘œνΌν‹°λ₯Ό 가진닀

    • message ν”„λ‘œνΌν‹° : Error μƒμ„±μž ν•¨μˆ˜μ— 인수둜 μ „λ‹¬ν•œ μ—λŸ¬ 메세지
    • stack ν”„λ‘œνΌν‹° : μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨ μ½œμŠ€νƒμ˜ 호좜 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ (디버깅 λͺ©μ )
  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ—λŸ¬ 객체λ₯Ό 생성할 수 μžˆλŠ” μƒμ„±μž ν•¨μˆ˜λ₯Ό 7가지 제곡

  • λͺ¨λ‘ Error.prototype을 상속 λ°›λŠ”λ‹€

μƒμ„±μžν•¨μˆ˜ μΈμŠ€ν„΄μŠ€
Error 일반적 μ—λŸ¬ 객체
SyntaxError μžλ°”μŠ€ν¬λ¦½νŠΈ 문법에 λ§žμ§€ μ•ŠλŠ” 문을 해석할 λ•Œ λ°œμƒν•˜λŠ” 객체
ReferenceError μ°Έμ‘°ν•  수 μ—†λŠ” μ‹λ³„μžλ₯Ό μ°Έμ‘°ν–ˆμ„ λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬ 객체
TypeError ν”Όμ—°μ‚°μž λ˜λŠ” 인수의 데이터 νƒ€μž…μ΄ μœ νš¨ν•˜μ§€ μ•Šμ„ λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬ 객체
RangeError 숫자 κ°’μ˜ ν—ˆμš© λ²”μœ„λ₯Ό 벗어났을 λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬ 객체
URIError encodeURI λ˜λŠ” decodeURI ν•¨μˆ˜μ— λΆ€μ μ ˆν•œ 인수λ₯Ό 전달 ν–ˆμ„ λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬ 객체
EvalError eval ν•¨μˆ˜μ—μ„œ λ°œμƒν•˜λŠ” μ—λŸ¬ 객체

throw λ¬Έ

  • μ—λŸ¬ 객체λ₯Ό μƒμ„±ν•œλ‹€κ³  μ—λŸ¬κ°€ λ°œμƒ λ˜λŠ” 것 μ•„λ‹˜
  • μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λ €λ©΄ try μ½”λ“œ λΈ”λ‘μ—μ„œ throw 문으둜 μ—λŸ¬ 객체λ₯Ό λ˜μ Έμ•Ό ν•œλ‹€.
  • throw문의 ν‘œν˜„μ‹μ€ μ–΄λ–€ 값이라도 상관 μ—†μ§€λ§Œ 일반적으둜 μ—λŸ¬ 객체λ₯Ό 지정
  • μ—λŸ¬λ₯Ό λ˜μ§€λ©΄ catch 문의 λ³€μˆ˜κ°€ μƒμ„±λ˜κ³  λ˜μ Έμ§„ μ—λŸ¬ 객체가 ν• λ‹Ή 됨

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

  • μ—λŸ¬λŠ” 호좜자(caller) λ°©ν–₯으둜 μ „νŒŒ λœλ‹€.
  • 즉, 콜 μŠ€νƒμ˜ μ•„λž˜ λ°©ν–₯(μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ ν‘Έμ‹œλ˜κΈ° 직적에 ν‘Έμ‹œλœ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ°©ν–₯)으둜 μ „νŒŒ
const foo = () => {
    throw Error('fooμ—μ„œ λ°œμƒν•œ μ—λŸ¬');
};

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

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

try {
    baz();
}catch (err) {
    console.error(err);
}
  • μœ„ μ˜ˆμ‹œμ˜ 경우 foo μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μ—λŸ¬κ°€ throw λ˜μ§€λ§Œ μ½œμŠ€νƒ μ•„λž˜ λ°©ν–₯으둜 μ „νŒŒλ˜μ–΄ μ „μ—­ μ‹€ν–‰ μ»¨νƒμŠ€νŠΈμ—μ„œ catch λœλ‹€
  • μ™œλƒ μ „μ—­ μ‹€ν–‰ μ»¨νƒμŠ€νŠΈμ˜ try λ‚΄λΆ€μ—μ„œ baz(); ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν–ˆκΈ° λ•Œλ¬Έμ— 이 ν•¨μˆ˜κ°€ 호좜자(caller)이닀.
  • μ£Όμ˜ν•  것은 비동기 ν•¨μˆ˜μΈ setTimeout μ΄λ‚˜ ν”„λ‘œλ―ΈμŠ€ 후속 처리 λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜λŠ” ν˜ΈμΆœμžκ°€ μ—†λ‹€λŠ” 것
  • setTimeout μ΄λ‚˜ ν”„λ‘œλ―ΈμŠ€ 후속 처리 λ©”μ„œλ“œλŠ” νƒœμŠ€ν¬ νλ‚˜ 마이크둜 νƒœμŠ€ν¬νμ— μΌμ‹œ μ €μž₯ λ˜μ—ˆλ‹€κ³ , 콜 μŠ€νƒμ΄ λΉ„λ©΄ 이벀트 루프에 μ˜ν•΄ 콜 μŠ€νƒμœΌλ‘œ ν‘Έμ‹œλ˜μ–΄ μ‹€ν–‰ λœλ‹€.
  • μ΄λ•Œ 콜 μŠ€νƒμ— ν‘Έμ‹œλœ 콜백 ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” 콜 μŠ€νƒμ˜ κ°€μž₯ ν•˜λΆ€μ— μ‘΄μž¬ν•˜κΈ° λ•Œλ¬΄μ—” μ—λŸ¬λ₯Ό μ „νŒŒν•  ν˜ΈμΆœμžκ°€ 쑴재 ν•˜μ§€ μ•ŠλŠ”λ‹€.

λŒ“κΈ€