관리 메뉴

Daehyunii's Dev-blog

47μž₯ μ—λŸ¬ 처리 λ³Έλ¬Έ

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

  μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것은 λΆˆκ°€λŠ₯에 가깝닀. λ”°λΌμ„œ μ—λŸ¬λŠ” μ–Έμ œλ‚˜ λ°œμƒν•  수 μžˆλ‹€. λ°œμƒν•œ μ—λŸ¬λŒ€ λŒ€ν•΄ λŒ€μ²˜ν•˜μ§€ μ•Šκ³  λ°©μΉ˜ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ€ κ°•μ œ μ’…λ£Œλœλ‹€.

console.log('[start]'); // [start]

foo(); // ReferenceError -> ν”„λ‘œκ·Έλž¨μ΄ κ°•μ œ μ’…λ£Œλœλ‹€.

console.log('[end]');

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

console.log('[start]'); // [start]

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

 console.log('[end]') // [end](ν”„λ‘œκ·Έλž¨μ΄ κ°•μ œ μ’…λ£Œλ˜μ§€ μ•ŠλŠ”λ‹€.)

이처럼 μ—λŸ¬λ‚˜ μ˜ˆμ™Έμ μΈ 상황에 λŒ€μ‘ν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œκ·Έλž¨μ€ κ°•μ œ μ’…λ£Œλ  것이닀. μ—λŸ¬λ‚˜ μ˜ˆμ™Έμ μΈ 상황은 λ„ˆλ¬΄ λ‹€μ–‘ν•˜κΈ° λ•Œλ¬Έμ— μ•„λ¬΄λŸ° 쑰치 없이 ν”„λ‘œκ·Έλž¨μ΄ κ°•μ œ μ’…λ£Œλœλ‹€λ©΄ 원인을 νŒŒμ•…ν•˜μ—¬ λŒ€μ‘ν•˜κΈ° μ–΄λ ΅λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 이에 λŒ€μ‘ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

 

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

  일반적으둜 try...catch...finally 문을 톡해 μ—λŸ¬ 처리λ₯Ό ν•œλ‹€. try...catch...finally 문은 3개의 μ½”λ“œ λΈ”λ‘μœΌλ‘œ κ΅¬μ„±λœλ‹€. finally 문은 λΆˆν•„μš”ν•˜λ‹€λ©΄ μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€. μ½”λ“œλŠ” μ•„λž˜μ˜ 예처럼 λ™μž‘ν•œλ‹€.

try{
    // μ—λŸ¬κ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ”μ½”λ“œ
}catch(error){
    // try μ½”λ“œ λΈ”λ‘μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ μ‹€ν–‰ ν•  μ½”λ“œ
    // errorμ—λŠ” try μ½”λ“œ λΈ”λ‘μ—μ„œ λ°œμƒν•œ Error 객체가 전달됨
}finally{
    // μ—λŸ¬ λ°œμƒκ³Ό 상관없이 λ°˜λ“œμ‹œ ν•œ 번 μ‹€ν–‰ 될 μ½”λ“œ(μ˜΅μ…˜)
}
console.log('[start]'); // [start]

try{
    // μ—λŸ¬κ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ”μ½”λ“œ
    foo(); 
}catch(error){
    // try μ½”λ“œ λΈ”λ‘μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ μ‹€ν–‰ ν•  μ½”λ“œ
    // errorμ—λŠ” try μ½”λ“œ λΈ”λ‘μ—μ„œ λ°œμƒν•œ Error 객체가 전달됨
    console.log(error); // ReferenceError: foo is not defined
}finally{
    // μ—λŸ¬ λ°œμƒκ³Ό 상관없이 λ°˜λ“œμ‹œ ν•œ 번 μ‹€ν–‰ 될 μ½”λ“œ(μ˜΅μ…˜)
    console.log('무쑰건 μ‹€ν–‰'); // 무쑰건 μ‹€ν–‰
}

console.log('[end]'); // [end]

47.3 Error 객체

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

const error = new Error('invalid');
console.log(error); // Error: invalid

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

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

 

47.4 throw λ¬Έ

  Error μƒμ„±μž ν•¨μˆ˜λ‘œ μ—λŸ¬ 객체λ₯Ό μƒμ„±ν•œλ‹€κ³  μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” 것은 μ•„λ‹ˆλ‹€. 즉, μ—λŸ¬ 객체 생성과 μ—λŸ¬ λ°œμƒμ€ μ˜λ―Έκ°€ λ‹€λ₯΄λ‹€.

try {
    // μ—λŸ¬ 객체λ₯Ό μƒμ„±ν•œλ‹€κ³  μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” 것은 μ•„λ‹˜
    new Error('something wrong');
} catch (error) {
    console.log(error);
}

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

try {
    // μ—λŸ¬ 객체λ₯Ό λ˜μ§€λ©΄ catch μ½”λ“œ 블둝이 μ‹€ν–‰λ˜κΈ° μ‹œμž‘ν•œλ‹€.
   throw new Error('something wrong');
} catch (error) {
    console.log(error); // Error: something wrong
}