λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive λμμ 47μ₯ μλ¬ μ²λ¦¬λ₯Ό μ 리νμμ΅λλ€.
μλ¬κ° λ°μνμ§ μλ μ½λλ₯Ό μμ±νλ κ²μ λΆκ°λ₯νλ€. 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');
querySelector
λ Array#find
λ©μλμ²λΌ μμΈμ μΈ μν©μ΄ λ°μνλ©΄ λ°ννλ κ°μ if λ¬Έμ΄λ λ¨μΆ νκ° λλ μ΅μ
λ 체μ΄λ μ°μ°μλ₯Ό ν΅ν΄ νμΈν΄μ μ²λ¦¬νλ λ°©λ²try {
// μ€νν μ½λ(μλ¬κ° λ°μν κ°λ₯μ±μ΄ μλ μ½λ)
} catch (err) {
// try μ½λ λΈλ‘μμ μλ¬κ° λ°μνλ©΄ μ΄ μ½λ λΈλ‘μ μ½λκ° μ€νλλ€.
// err μλ try μ½λ λΈλ‘μμ λ°μν Error κ°μ²΄κ° μ λ¬λλ€.
} finally {
// μλ¬ λ°μκ³Ό μκ΄μμ΄ λ°λμ ν λ² μ€νλλ€.
}
Error μμ±μ ν¨μ
μλ μλ¬λ₯Ό μμΈν μ€λͺ
νλ μλ¬ λ©μμ§λ₯Ό μΈμλ‘ μ λ¬ν μ μλ€.
const error = new Error('invalid');
Error μμ±μ ν¨μκ° μμ±ν μλ¬ κ°μ²΄λ message νλ‘νΌν°μ stack νλ‘νΌν°λ₯Ό κ°λλ€. message νλ‘νΌν°μ κ°μ Error μμ±μ ν¨μμ μΈμλ‘ μ λ¬ν μλ¬ λ©μμ§μ΄κ³ , stack νλ‘νΌν°μ κ°μ μλ¬λ₯Ό λ°μμν¨ μ½μ€νμ νΈμΆ μ 보λ₯Ό λνλ΄λ λ¬Έμμ΄μ΄λ©° λλ²κΉ λͺ©μ μΌλ‘ μ¬μ©νλ€.
μλ¬ κ°μ²΄ μμ±κ³Ό μλ¬ λ°μμ μλ―Έκ° λ€λ₯΄λ€.
μλ¬λ₯Ό λ°μμν€λ €λ©΄ try μ½λ λΈλ‘μμ throw λ¬ΈμΌλ‘ μλ¬ κ°μ²΄λ₯Ό λμ ΈμΌ νλ€.
throw ννμ;
throw λ¬Έμ ννμμ μ΄λ€ κ°μ΄λΌλ μκ΄μμ§λ§ γ 리λ°μ μΌλ‘ μλ¬ κ°μ²΄λ₯Ό μ§μ νλ€. μλ¬λ₯Ό λμ§λ©΄ catchλ¬Έμ μλ¬ λ³μκ° μμ±λκ³ λμ Έμ§ μ¬λ¬ κ°μ²΄κ° ν λΉλλ€. κ·Έλ¦¬κ³ catch μ½λ λΈλ‘μ΄ μ€νλκΈ° μμνλ€.
μλ¬λ νΈμΆμ λ°©ν₯μΌλ‘ μ νλλ€. μ¦, μ½ μ€νμ μλλ°©ν₯μΌλ‘ μ νλλ€.
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β, μν€λΆμ€