ν°μ€ν 리 λ·°
[JavaScript] μλ¬ μ²λ¦¬
κ°λ°κ°κ΅΄πΈ 2022. 8. 19. 20:56μλ¬ μ²λ¦¬μ νμμ±
μλ¬κ° λ°μνμ§ μλ μ½λλ₯Ό μμ±νλ κ²μ λΆκ°λ₯ν©λλ€. νμ§λ§, μ΄λ¬ν μλ¬λ μμΈμ μΈ μν©μ λμνμ§ μμΌλ©΄ νλ‘κ·Έλ¨μ κ°μ μ’ λ£λ κ²μ λλ€.
μλ¬λ μμΈμ μΈ μν©μ μλμ κ°μ΄ λ€μν©λλ€.
// μλ¬1
console.log('[Start]');
foo(); // ReferenceError: foo is not defined
// λ°μν μλ¬λ₯Ό λ°©μΉνλ©΄ νλ‘κ·Έλ¨μ κ°μ μ’
λ£λλ€.
// μλ¬μ μν΄ νλ‘κ·Έλ¨μ΄ κ°μ μ’
λ£λμ΄ μλ μ½λλ μ€νλμ§ μλλ€.
console.log('[End]');
// μλ¬2
const $elem = document.querySelector('#1');
// DOMException: Failed to execute 'querySelector' on 'Document': '#1' is not a valid selector.
// μμΈ μν©1
// DOMμ button μμκ° μ‘΄μ¬νμ§ μμΌλ©΄ querySelector λ©μλλ μλ¬λ₯Ό λ°μμν€μ§ μκ³ nullμ λ°ννλ€.
const $button = document.querySelector('button'); // null
$button.classList.add('disabled');
// TypeError: Cannot read property 'classList' of null
- μ μλμ§ μμ κ°μ²΄μ λν μ°Έμ‘°λ‘ μΈν μλ¬
- querySelector λ©μλλ μΈμλ‘ μ λ¬ν λ¬Έμμ΄μ΄ CSS μ νμ λ¬Έλ²μ λ§μ§ μλ κ²½μ° μλ¬ λ°μ
- querySelector λ©μλλ μΈμλ‘ μ λ¬ν CSS μ νμ λ¬Έμμ΄λ‘ DOMμμ μμ λ Έλλ₯Ό μ°Ύμ μ μλ κ²½μ° null λ°ν
λ°λΌμ μΈμ λ μλ¬λ μμΈμ μΈ μν©μ΄ λ°μν μ μλ€λ κ²μ μ μ νκ³ μ΄μ λμνλ μ½λλ₯Ό μμ±νλ κ²μ΄ μ€μν©λλ€.
try ... catch ... finally λ¬Έ
κΈ°λ³Έμ μΌλ‘ μλ¬ μλ¬ μ²λ¦¬λ₯Ό ꡬννλ λ°©λ²μ ν¬κ² λ κ°μ§κ° μμ΅λλ€.
- querySelectorλ Array#find λ©μλμ²λΌ μμΈμ μΈ μν©μ΄ λ°μνλ©΄ λ°ννλ κ°(null λλ -1)μ if λ¬Έμ΄λ λ¨μΆ νκ° λλ μ΅μ λ 체μ΄λ μ°μ°μ(?)λ₯Ό ν΅ν΄ νμΈν΄ μ²λ¦¬νλ λ°©λ²
- μλ¬ μ²λ¦¬ μ½λλ₯Ό 미리 λ±λ‘ν΄ λκ³ μλ¬κ° λ°μνλ©΄ μλ¬ μ²λ¦¬ μ½λλ‘ μ ννλλ‘ νλ λ°©λ²
try ... catch ... filnally λ¬Έμ λ λ²μ§Έ λ°©λ²μΌλ‘ μΌλ°μ μΌλ‘ μλ¬ μ²λ¦¬(error handling)λΌκ³ ν©λλ€.
console.log('[Start]');
try {
// μ€νν μ½λ(μλ¬κ° λ°μν κ°λ₯μ±μ΄ μλ μ½λ)
foo();
} catch (err) {
// try μ½λ λΈλ‘μμ μλ¬κ° λ°μνλ©΄ μ΄ μ½λ λΈλ‘μ μ½λκ° μ€νλλ€.
// errμλ try μ½λ λΈλ‘μμ λ°μν Error κ°μ²΄κ° μ λ¬λλ€.
console.error(err); // ReferenceError: foo is not defined
} finally {
// μλ¬ λ°μκ³Ό μκ΄μμ΄ λ°λμ ν λ² μ€νλλ€.
console.log('finally');
}
// try...catch...finally λ¬ΈμΌλ‘ μλ¬λ₯Ό μ²λ¦¬νλ©΄ νλ‘κ·Έλ¨μ΄ κ°μ μ’
λ£λμ§ μλλ€.
console.log('[End]');
- try μ½λ λΈλ‘μ΄ μ€νλλ©΄ try μ½λ λΈλ‘μ ν¬ν¨λ λ¬Έ μ€μμ μλ¬κ° λ°μνλ©΄ catch λ¬Έμ err λ³μμ μ λ¬
- catch λ¬Έμ err λ³μλ try μ½λ λΈλ‘μ ν¬ν¨λ λ¬Έ μ€μμ μλ¬κ° λ°μνλ©΄ μμ±λκ³ catch μ½λ λΈλ‘μμλ§ μ ν¨
- finally μ½λ λΈλ‘μ μλ¬ λ°μκ³Ό μκ΄μμ΄ λ°λμ ν λ² μ€ν (μλ΅ κ°λ₯)
μ΄μ²λΌ try ... catch ... filnally λ¬ΈμΌλ‘ μλ¬λ₯Ό μ²λ¦¬νλ©΄ νλ‘κ·Έλ¨μ΄ κ°μ μ’ λ£λμ§ μμ΅λλ€.
Error κ°μ²΄
Error μμ±μ ν¨μλ μλ¬λ₯Ό μμΈν μ€λͺ νλ μλ¬ λ©μμ§λ₯Ό μΈμλ‘ μ λ¬λ°μ μ μμΌλ©° μλ¬ κ°μ²΄λ₯Ό μμ±ν©λλ€.
const error = new Error('invalid');
Error μμ±μ ν¨μκ° μμ±ν μλ¬ κ°μ²΄λ message νλ‘νΌν°μ stack νλ‘νΌν°λ₯Ό κ°μ§λλ€.
- message νλ‘νΌν° κ° : Error μμ±μ ν¨μμ μΈμλ‘ μ λ¬ν μλ¬ λ©μμ§
- stack νλ‘νΌν° κ° : μλ¬λ₯Ό λ°μμν¨ μ½ μ€νμ νΈμΆ μ 보λ₯Ό λνλ΄λ λ¬Έμμ΄μ΄λ©° λλ²κΉ λͺ©μ μΌλ‘ μ¬μ©
μλ°μ€ν¬λ¦½νΈλ λ€μκ³Ό κ°μ΄ Error μμ±μ ν¨μλ₯Ό ν¬ν¨ν΄ 7κ°μ§μ Error.prototypeμ μμλ°λ μλ¬ κ°μ²΄λ₯Ό μμ±ν μ μλ Error μμ±μ ν¨μλ₯Ό μ 곡ν©λλ€.
μμ±μ ν¨μ | μΈμ€ν΄μ€ |
Error | μΌλ°μ μλ¬ κ°μ²΄ |
SyntaxError | μλ°μ€ν¬λ¦½νΈ λ¬Έλ²μ λ§μ§ μλ λ¬Έμ ν΄μν λ λ°μνλ μλ¬ κ°μ²΄ |
ReferenceError | μ°Έμ‘°ν μ μλ μλ³μλ₯Ό μ°Έμ‘°νμ λ λ°μνλ μλ¬ κ°μ²΄ |
TypeError | νΌμ°μ°μ λλ μΈμμ λ°μ΄ν° νμ μ΄ μ ν¨νμ§ μμ λ λ°μνλ μλ¬ κ°μ²΄ |
RangeError | μ«μκ°μ νμ© λ²μλ₯Ό λ²μ΄λ¬μ λ λ°μνλ μλ¬ κ°μ²΄ |
URIError | encodeURI λλ decodeURI ν¨μμ λΆμ μ ν μΈμλ₯Ό μ λ¬νμ λ λ°μνλ μλ¬ κ°μ²΄ |
EvalError | eval ν¨μμμ λ°μνλ μλ¬ κ°μ²΄ |
1 @ 1; // SyntaxError: Invalid or unexpected token
foo(); // ReferenceError: foo is not defined
null.foo; // TypeError: Cannot read property 'foo' of null
new Array(-1); // RangeError: Invalid array length
decodeURIComponent('%'); // URIError: URI malformed
throw λ¬Έ
Error μμ±μ ν¨μλ‘ μλ¬ κ°μ²΄λ₯Ό μμ±νλ€κ³ μλ¬κ° λ°μνλ κ²μ΄ μλλΌ μλ¬λ₯Ό λ°μμν€λ €λ©΄ try μ½λ λΈλ‘μμ throwλ¬ΈμΌλ‘ μλ¬ κ°μ²΄λ₯Ό λμ ΈμΌ ν©λλ€.
throw ννμ;
throw λ¬Έμ ννμμ μ΄λ€ κ°μ΄λΌλ μκ΄μμ§λ§ μΌλ°μ μΌλ‘ μλ¬ κ°μ²΄λ₯Ό μ§μ ν©λλ€. μλ¬λ₯Ό λμ§λ©΄ catch λ¬Έμ μλ¬ λ³μκ° μμ±λκ³ λμ Έμ§ μλ¬ κ°μ²΄κ° ν λΉλκ³ catch μ½λ λΈλ‘μ΄ μ€νλ©λλ€.
try {
// μλ¬ κ°μ²΄λ₯Ό λμ§λ©΄ catch μ½λ λΈλ‘μ΄ μ€νλκΈ° μμνλ€.
throw new Error('something wrong');
} catch (error) {
console.log(error);
}
throw λ¬Έμ νμ©ν΄ μΈλΆμμ μ λ¬λ°μ μ½λ°± ν¨μλ₯Ό nλ²λ§νΌ λ°λ³΅ νΈμΆνλ repeat ν¨μλ₯Ό ꡬννλ©΄ λ€μκ³Ό κ°μ΅λλ€.
// μΈλΆμμ μ λ¬λ°μ μ½λ°± ν¨μλ₯Ό nλ²λ§νΌ λ°λ³΅ νΈμΆνλ€
const repeat = (n, f) => {
// 맀κ°λ³μ fμ μ λ¬λ μΈμκ° ν¨μκ° μλλ©΄ TypeErrorλ₯Ό λ°μμν¨λ€.
if (typeof f !== 'function') throw new TypeError('f must be a function');
for (var i = 0; i < n; i++) {
f(i); // iλ₯Ό μ λ¬νλ©΄μ fλ₯Ό νΈμΆ
}
};
try {
repeat(2, 1); // λ λ²μ§Έ μΈμκ° ν¨μκ° μλλ―λ‘ TypeErrorκ° λ°μ(throw)νλ€.
} catch (err) {
console.error(err); // TypeError: f must be a function
}
μλ¬μ μ ν
μλ¬λ νΈμΆμ(caller) λ°©ν₯μΌλ‘ μ νλ©λλ€. μ¦, μ½ μ€νμ μλ λ°©ν₯(μ€ν μ€μΈ μ€ν 컨ν μ€νΈκ° νΈμλκΈ° μ§μ μ νΈμλ μ€ν 컨ν μ€νΈ λ°©ν₯)μΌλ‘ μ νλ©λλ€.
const foo = () => {
throw Error('fooμμ λ°μν μλ¬'); // β£
};
const bar = () => {
foo(); // β’
};
const baz = () => {
bar(); // β‘
};
try {
baz(); // β
} catch (err) {
console.error(err);
}
μ μμ μ νΈμΆ μμλ baz ν¨μ νΈμΆ -> bar ν¨μ νΈμΆ -> foo ν¨μ νΈμΆμ΄λ©° foo ν¨μκ° throwν μλ¬λ λ€μκ³Ό κ°μ΄ νΈμΆμμκ² μ νλμ΄ μ μμμ μΊμΉλ©λλ€.
throwλ μλ¬λ₯Ό μΊμΉνμ¬ μ μ ν λμνλ©΄ νλ‘κ·Έλ¨μ κ°μ μ’ λ£μν€μ§ μκ³ μ½λμ μ€ν νλ¦μ 볡ꡬν μ μμ΅λλ€.
νμ§λ§ λΉλκΈ° ν¨μμΈ setTimeoutμ΄λ νλ‘λ―Έμ€ νμ μ²λ¦¬ λ©μλμ μ½λ°± ν¨μλ μλ¬λ₯Ό μ νν νΈμΆμκ° μ‘΄μ¬νμ§ μλλ€λ κ²μ μ£Όμν΄μΌ ν©λλ€.
[μΆμ²] λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive
'JavaScript > λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JavaScript] Babelκ³Ό Webpackμ μ΄μ©ν ES6+/ES.NEXT κ°λ° νκ²½ κ΅¬μΆ (0) | 2022.08.22 |
---|---|
[JavaScript] λͺ¨λ (1) | 2022.08.20 |
[JavaScript] μ λλ μ΄ν°μ async/await (0) | 2022.08.17 |
[JavaScript] νλ‘λ―Έμ€(Promise) (0) | 2022.08.17 |
[JavaScript] REST API (0) | 2022.08.16 |
- Total
- Today
- Yesterday
- fp
- μ΄μ체μ
- μΉ΄μΉ΄μ€ μΈν΄
- μλ°μ€ν¬λ¦½νΈ
- νλ‘κ·Έλλ¨Έμ€
- μλ°
- λ°±μ€
- JavaScript
- κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
- λ€νΈμν¬
- http
- git
- ν¬ν¬μΈν°
- λͺ¨λ μλ°μ€ν¬λ¦½νΈ deep dive
- λ°±μ€ node.js
- Baekjoon
- map
- μ½λ©ν μ€νΈ
- νλ‘ν μ½
- TDD
- λ°±μ€ javascript
- λ μ컬 νκ²½
- λ€μ΄λλ―Ή νλ‘κ·Έλλ°
- μ μ λ³μ
- νλ‘νΌν°
- λμμΈ ν¨ν΄
- 2019 μΉ΄μΉ΄μ€ κ°λ°μ κ²¨μΈ μΈν΄
- ν¨μν νλ‘κ·Έλλ°
- μκ³ λ¦¬μ¦
- μ΄λΆνμ
μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |