-
[Javascript] μλ¬ νΈλ€λ§, try, catch, finally, error, error bubblingμΉ/JavaScript 2023. 1. 13. 19:16
π μλ¬ νΈλ€λ§ error handling μ νμμ±
μλ¬/μλ¬ error λ°μμ λλΉνμ§ μμΌλ©΄ νλ‘κ·Έλ¨μ΄ μ’ λ£λ¨
console.log('μλ¬ λ°μ μ ');β// β οΈ μ€λ₯λ₯Ό λ°μμν€λ μ½λ(3).split('');β// μΆλ ₯λμ§ μμconsole.log('μλ¬ λ°μ ν');
I. μλ°μ€ν¬λ¦½νΈμ μλ¬ νΈλ€λ§
1. try ... catch λ¬Έ
console.log('μλ¬ λ°μ μ ');βtry {(3).split('');β} catch (e) {console.error('π μλ¬!!', e);}βconsole.log('μλ¬ λ°μ ν');try λΈλ‘
- μλ¬ λ°μ μ¬μ§κ° μλ μ½λ ν¬ν¨
- μ΄κ³³μμ λ°μν μλ¬λ νλ‘κ·Έλ¨μ λ©μΆμ§ μμ
catch λΈλ‘
- μλ¬ λ°μμ μ€νν μ½λ ν¬ν¨
- λ°μν μ€λ₯ κ°μ²΄λ₯Ό μΈμλ‘ λ°μ
const arr = ['ABC', 'κ°λλ€', 123, '123'];βfunction getLetterArray (str) {// π‘ μΈμλ‘ μ΄λ€ νμ μ κ°μ΄ μ£Όμ΄μ§μ§ λͺ¨λ₯΄λ μν©try {return str.split('');β} catch (e) {console.error('π μλ¬!!', e);return [];}}βarr.forEach(i => {console.log(getLetterArray(i));});2. try ... catch ... finally λ¬Έ
finally λΈλ‘
- μ€λ₯κ° λ°μ μ¬λΆμ κ΄κ³μμ΄ ν λ² μ€νλλ μ½λ ν¬ν¨
- μλμ κ°μ κ²½μ° λ리 μ¬μ©
function connect () { console.log('βοΈ', 'ν΅μ μ°κ²°'); }function disconnect () { console.log('π', 'ν΅μ μ°κ²° ν΄μ '); }function sendArray (arr) { console.log('μ μ‘', arr); }βfunction sendStringAsArray (str) {connect();βtry {sendArray(str.split(''));return true;β} catch (e) {console.error('π μλ¬!!', e);return false;β} finally {// π‘ μ μ‘ μ±κ³΅ μ¬λΆμ κ΄κ³μμ΄ μ°κ²°μ λμ΄μΌ ν¨disconnect();console.log('- - - - - - - -');}β// β μ΄κ³³μ λ£λ κ²κ³Ό 무μμ΄ λ€λ₯Έκ°?// μλλ‘ λ체νμ¬ μ€νν΄ λ³Ό κ²// disconnect();// console.log('- - - - - - - -');}β['ABC', 'κ°λλ€', 123, '123'].forEach(i => {console.log(sendStringAsArray(i)? '[μ±κ³΅]' : '[μ€ν¨]', '\n\n');});- β tryλ catch λ¬Έμ returnμ΄ μλλΌλ λ°λμ μ€ν!
II. Error κ°μ²΄
- μλ¬ λ°μ μ λμ Έμ§λ thrown κ°μ²΄
- μλ¬μ λν μ 보λ₯Ό λ΄κ³ μμ
- π‘ μλ¬κ° λ°μνμ§ μμλ, μ§μ μμ±νμ¬ λμ§κΈ° κ°λ₯
- π MDN λ¬Έμ 보기
1. κΈ°λ³Έ μμ±κ³Ό μ¬μ©λ²
const error = new Error('λκ° μλͺ»λμ΄');βconsole.error(error);// λ λ²μ§Έ μΈμλ‘ μ΄μ λ₯Ό λͺ μν μλ μμconst error = new Error('λκ° μλͺ»λμ΄',{ cause: 'λ μλͺ»νμΌλκΉ' });βconsole.error(error);κΈ°λ³Έ μΈμ€ν΄μ€ νλ‘νΌν°μ λ©μλ
console.log(error.name);console.log(error.message);β// causeλ₯Ό μ λ ₯νμ κ²½μ°console.log(error.cause);// μλ¬ μ체λ₯Ό λ‘κ·Έ μΆλ ₯νλ©΄ λμ€λ 문ꡬconsole.log(error.toString());β μλμ μΌλ‘ μλ¬ λ°μμν€κΈ°
throw new Error('μ΄μ λ₯Ό λ¬»μ§ λ§λΌ');2. μλ¬μ μ¬λ¬ μ’ λ₯
β μλμ μλ¬λ€μ λͺ¨λ ErrorλΆν° μμλ°μ
μ£Όμ μλ¬μ€λͺ
SyntaxError λ¬Έλ²μ μ΄μμ΄ μμ λ TypeError μ£Όμ΄μ§ λͺ λ Ήμ μ μ ν μλ£νμ΄ μλ λ ReferenceError μλͺ»λ κ°μ μ°Έμ‘°νμ λ RangeError μ ν¨ν λ²μλ₯Ό λ²μ΄λλ μ«μκ° μ¬μ©λμμ λ - μ΄λ€ λ¬Έμ μ μν μλ¬μΈμ§ μ½κ² μλ³ κ°λ₯νλλ‘ ν¨
- π κΈ°ν μλ¬ μ ν MDN λ¬Έμ 보기
const x x;const errorFuncs = [// μλ£νμ λ§μ§ μλ λ©μλ νΈμΆ() => { (3).split(''); },β// μ μΈλμ§ μμ ν¨μ νΈμΆ() => { hello(); },β// λΆμ μ ν μ«μλ₯Ό μΈμλ‘ μ λ¬() => { (123.45).toFixed(-1); }];errorFuncs.forEach(func => {try {func();β} catch (e) {console.error(e);console.log(e.name);console.log(e.message, '\n\n');}});π‘ μ€λ₯μ μ’ λ₯μ λ°λΌ λμ²νκΈ°
errorFuncs.forEach(func => {try {func();β} catch (e) {if (e instanceof TypeError) {console.error('μλ£ν νμΈνμΈμ.');return;}if (e instanceof ReferenceError) {console.error('μ μΈ μ λ κ±° μ΄ κ±° μλμ§ νμΈνμΈμ.');return;}console.error('μλ, λ ν κ±°μμ?');}});π‘ μ§μ μ€λ₯λ₯Ό μμ±νμ¬ λμ§κΈ°
- μ»΄ν¨ν°κ° μΈμ§νμ§ λͺ»νλ μλ¬ μλ λ°μ
// νΉμ μμ λΉλ²μΌλ‘ μ§μνλ ν¨μfunction applyForMonth (date) {try {if (typeof date !== 'number') {throw new TypeError('μ«μλ‘ μ λ ₯ν΄μ£ΌμΈμ.');}if (date < 1 || date > 12) {throw new RangeError('μ ν¨ν μμ μ λ ₯ν΄μ£ΌμΈμ.');}βconsole.log(`${date}μ λΉλ²μΌλ‘ λ±λ‘λμ ¨μ΅λλ€.`);β} catch (e) {console.error('π μλ¬ λ°μ!', e);console.log('λ€μ λ±λ‘ν΄μ£ΌμΈμ.');}}applyForMonth(5);applyForMonth('5');applyForMonth(13);3. 컀μ€ν μλ¬ λ§λ€κΈ°
class MilitaryError extends Error {constructor (position, ...params) {super(...params);βthis.name = 'MilitaryError';βswitch (position) {case 'μ΄λ³':this.message = 'κ°νμ΄κ΅°. λ§μ μ λ°λ €μλ΄.';break;case 'μΌλ³':this.message += ' μλλ € λ»μ³.';break;case 'μλ³':this.message = '짬μ κ±°κΎΈλ‘ λ¨Ήμλ. ' + this.message;break;default:this.message = 'μ§μ κ° λ λλ€ μ΄κ±°μ§? γ γ ';}}}class Soldier {constructor (position) {this.position = position;}βspeak (word) {console.log(this.position + ':', word);try {if (!'λ€λκΉ'.includes(word.at(-1))) {throw new MilitaryError(this.position,'κ΅°λμμ λͺ¨λ λ§μ λ€λκΉλ‘ λλΈλ€.');}β} catch (e) {console.error(e);}}}['μ΄λ³', 'μΌλ³', 'μλ³', 'λ³μ₯'].forEach(pos => {const soldier = new Soldier(pos);soldier.speak('λ¬΄μ¨ μΌμ λκΉ');soldier.speak('μμ');});
III. μλ¬ λ²λΈλ§ error bubbling
λ€λ₯Έ ν¨μλ₯Ό νΈμΆνμ λ
- μλ¬ λ°μμ ν΄λΉ ν¨μμμ μ‘μ§ μμΌλ©΄ νΈμΆν κ³³μΌλ‘ λμ Έμ§
- λ€μ€ νΈμΆμ μλ¬λ₯Ό νΈλ€λ§νλ μ½λκ° μλ νΈμΆμκΉμ§ μ λ¬λ¨
function func1 () {throw new Error('μλ¬');}βfunction func2 () {func1();}βfunction func3 () {func2();}βfunction func4 () {try {func3();β} catch (e) {console.error(e);}console.log('μ€νμλ£');}βfunc4();- β μλ¬λ κ°λ₯ν λ°μ κ³³ κ°κΉμ΄μ μ²λ¦¬νλ κ²μ΄ μ’μ
π§πΌ μ¬μ₯ > λΆμ₯ > λ리 > μ¬μ λ¨κ³λ‘ μΌμ μμΌ°μ λ
function func1 (e) { // μ¬μtry {if (e) { throw e }console.log('μ κ° λ΄λ λμ£ ?');console.log('- - - - - - - - - -');β} catch (e) {if (e instanceof SyntaxError) {console.error('μ μ΄κ±΄ μμμ!', e);console.log('- - - - - - - - - -');return;}console.log('λ리λ, μ΄κ±° λμμ?');throw e; // π‘ μ²λ¦¬νμ§ λͺ»νλ μλ¬λ μμ μΌλ‘ λμ§}}function func2 (e) { // λ리try {func1(e);} catch (e) {if (e instanceof TypeError) {console.error('λ΄κ° ν ν λ κ°λ΄μ.', e);console.log('- - - - - - - - - -');return;}console.log('λΆμ₯λ, μ΄κ±΄ μ μ μμ μ λκ² μ΅λλ€.');throw e;}}function func3 (e) { // λΆμ₯try {func2(e);} catch (e) {if (e instanceof ReferenceError) {console.error('μ νμ, μ?', e);console.log('- - - - - - - - - -');return;}console.log('μ¬μ₯λ, μ΄κ² μ’ λ³΄μ μΌκ² μ΅λλ€.');throw e;}}function func4 (e) { // μ¬μ₯try {func3(e);β} catch (e) {console.error('μ μ μ§ν©.', e);}}func4();func4(new SyntaxError());func4(new TypeError());func4(new ReferenceError);func4(new RangeError);'μΉ > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Javascript] μ격λͺ¨λ, strict mode, use strict (0) 2023.01.13 [Javascript] var (0) 2023.01.13 [Javascript] μ λλ μ΄ν°, generator (0) 2023.01.13 [Javascript] Set, Map (1) 2023.01.13 [Javascript] Symbol (0) 2023.01.13