ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Javascript] μ—λŸ¬ 핸듀링, try, catch, finally, error, error bubbling
    μ›Ή/JavaScript 2023. 1. 13. 19:16

    πŸ› μ—λŸ¬ 핸듀링 error handling μ˜ ν•„μš”μ„±

    μ—λŸ¬/μ—λŸ¬ error λ°œμƒμ— λŒ€λΉ„ν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ¨

    console.log('μ—λŸ¬ λ°œμƒ μ „');
    ​
    // ⚠️ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€λŠ” μ½”λ“œ
    (3).split('');
    ​
    // 좜λ ₯λ˜μ§€ μ•ŠμŒ
    console.log('μ—λŸ¬ λ°œμƒ ν›„');




     

    I. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ—λŸ¬ 핸듀링

    πŸ‘‰ MDN λ¬Έμ„œ 보기

    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 μœ νš¨ν•œ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λŠ” μˆ«μžκ°€ μ‚¬μš©λ˜μ—ˆμ„ λ•Œ
    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
Designed by Tistory.