[JavaScript] flow control

๐Ÿค” Flow constrol (์ œ์–ดํ๋ฆ„, ํ๋ฆ„์ œ์–ด) ๋ž€?

  • ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐœ๋ณ„ ๋ช…๋ น๋ฌธ, ๋ช…๋ น ๋˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ํ‰๊ฐ€๋˜๋Š” ์ˆœ์„œ
  • 5๊ฐ€์ง€ ์ œ์–ดํ๋ฆ„์˜ ์ข…๋ฅ˜
    • goto : ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์—์„œ ์‹œ์ž‘ -> ๊ฐœ๋ฐœ ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ. 
    • choice : ์ผ๋ถ€ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ผ๋ จ์˜ ๋ช…๋ น๋ฌธ ์‹คํ–‰ -> If-else / switch
    • loop : ์–ด๋–ค ์กฐ๊ฑด์ด ์ถฉ์กฑ๋  ๋•Œ๊นŒ์ง€ ์ผ๋ จ์˜ ๋ช…๋ น๋ฌธ์„ 0ํšŒ ์ด์ƒ ์‹คํ–‰ -> Collection loop / General lop
    • continue : ํ˜„์žฌ ์‹คํ–‰ ๊ตฌ๋ฌธ์—์„œ ๋–จ์–ด์ง„ ํ•œ ๊ตฌ๋ฌธ์˜ ์ง‘ํ•ฉ์„ ์‹คํ–‰ -> Loop continuation
    • break : ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์ค‘๋‹จ => Loop earyl exit, ํ•จ์ˆ˜ ์‹คํ–‰ ์ •์ง€ ]

ํ‘œํ˜„์‹๊ณผ ๋ฌธ์˜ ๊ฐœ๋…

- ํ‘œํ˜„์‹ 

  • ์–ด๋–ค ๊ฐ’์œผ๋กœ ์ดํ–‰๋˜๋Š” ์ž„์˜์˜ ์œ ํšจํ•œ ์ฝ”๋“œ ๋‹จ์œ„
  • ํ‘œํ˜„์‹์ด ํ‰๊ฐ€๋˜๋ฉด, ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๊ฐ’์„ ์ฐธ์กฐ
  • ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์€ ๋ชจ๋‘ ํ‘œํ˜„์‹
  • ๋ฆฌํ„ฐ๋Ÿด ํ‘œํ˜„์‹, ํ•จ์ˆ˜ ํ‘œํ˜„์‹, ... 
const ๋ณ€์ˆ˜๋ช… = 'apple';
const ํ•จ์ˆ˜ = (์ธ์ž) => {
	if(์ธ์ž === 'apple'){
    	return '๐ŸŽ';
    } else {
    	return 'โŒ';
    }
};
ํ•จ์ˆ˜('apple')

- ๋ฌธ statement

  • ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„, ์ตœ์†Œ ์‹คํ–‰ ๋‹จ์œ„
    • == ๋ช…๋ น๋ฌธ
  • ์„ ์–ธ๋ฌธ, ํ• ๋‹น๋ฌธ, ์ œ์–ด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ๋ธ”๋Ÿญ๋ฌธ ...
let ๋ณ€์ˆ˜๋ช…; //๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ
๋ณ€์ˆ˜๋ช… = 'apple'; //ํ• ๋‹น๋ฌธ
function ํ•จ์ˆ˜() {} //ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ
if(true) { //์กฐ๊ฑด๋ฌธ
	console.log('true');
}
while(false){ //๋ฐ˜๋ณต๋ฌธ
	console.log('while');
}
  • ๋ธ”๋Ÿญ๋ฌธ block statement
    • ๋ช…๋ น๋ฌธ๋“ค์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋Š” ๋ธ”๋Ÿญ๋ฌธ
    • ํ•œ์Œ์˜ ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์„œ ํ‘œํ˜„
{
	123;
    const foo = 'apple';
    function ํ•จ์ˆ˜() {
    	return 1;
    }
}
  • choice 
    • If..else
      • ๋…ผ๋ฆฌ์กฐ๊ฑด์˜ ์ฐธ/๊ฑฐ์ง“์— ๋”ฐ๋ผ ๋ช…๋ น๋ฌธ์„ ์‹คํ–‰ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ
      • if๋ฌธ์˜ ๋…ผ๋ฆฌ์กฐ๊ฑด์—๋Š” true, false๋กœ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œํ˜„์‹ ๋Œ€์ž…๊ฐ€๋Šฅ
      • ๋…ผ๋ฆฌ์กฐ๊ฑด ์ฐธ์ธ ๊ฒฝ์šฐ, if๋ธ”๋Ÿญ๋ฌธ ์‹คํ–‰ / ๋…ผ๋ฆฌ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ธ ๊ฒฝ์šฐ, else๋ธ”๋ก๋ฌธ ์‹คํ–‰
      • ํ•ด๋‹น๊ฐ’์€ false๋กœ ํ‰๊ฐ€ : false, undefined, null, 0, Nan, ""(empty string)
      • ์‹ค์ œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ค‘์ฒฉ if๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ
      • ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ์˜ ๋ฆฌํŒฉํ† ๋ง ์ž๋ฃŒ
        • nested conditional ์ง€์–‘
        • Guard Clauses ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ โœ”๏ธ
//nested conditional (์ง€์–‘)
const ์กฐ๊ฑด๋ฌธ = (์ธ์ž) => ์ธ์ž === 1;
const ์กฐ๊ฑด๋ฌธ2 = (์ธ์ž) => ์ธ์ž === 2;

const ํ•จ์ˆ˜ = (์ธ์ž) => {
	if (์กฐ๊ฑด๋ฌธ(์ธ์ž)) {
    	return 1;
    } else if (์กฐ๊ฑด๋ฌธ2(์ธ์ž)) {
    	return 2;
    } else return 3;
}; 

ํ•จ์ˆ˜(2);

//Guard Clauses (๊ถŒ์žฅ)
const ์กฐ๊ฑด๋ฌธ = (์ธ์ž) => ์ธ์ž === 1;
const ์กฐ๊ฑด๋ฌธ2 = (์ธ์ž) => ์ธ์ž === 2;

const ํ•จ์ˆ˜ = (์ธ์ž) => {
	if (์กฐ๊ฑด๋ฌธ(์ธ์ž)) return 1;
	if (์กฐ๊ฑด๋ฌธ2(์ธ์ž)) return 2;
    return 3;
}; 

ํ•จ์ˆ˜(2);
  • switch
    • switch์™€ ํ‘œํ˜„์‹์„ ์ž‘์„ฑ, ๋ผ๋ฒจ์ด ํฌํ•จ๋œ case์ ˆ์„ ์ž‘์„ฑ
    • default๋Š” ๋ผ๋ฒจ์—†์ด ์ž‘์„ฑ
const foo = (parameter) => {
	switch(parameter){
    	case 1:
        	return 1;
        case 2:
        case 3:
        case 4:
        	return 4;
        default:
        	return 0;
    }
}

foo(3) __ 23
  • Loop(interations)
    • Loop early exit : break
    • Loop continuation : continue
    • Conditional loop 
      • ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—๋Š” ์ผ๋ถ€ ์กฐ๊ฑด์ด ๋ณ€๊ฒฝ๋  ๋•Œ๊นŒ์ง€ ๋ฃจํ”„๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์žˆ๋‹ค.
      • ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค. 
        • ์‹œ์ž‘ํ•  ๋•Œ ์กฐ๊ฑด์„ ํ‰๊ฐ€ (๋ณธ๋ฌธ ์ƒ๋žต ๊ฐ€๋Šฅ)
          • while
let count = 0;
while(count <3){
	count++;
    console.log(count);
}

console.log('end');

>> 1 2 3 'end'

let count = 3;
while(count <3) {
	count++;
    console.log(count);
}

console.log('end');

>> 'end'
    • ๋งˆ์ง€๋ง‰์— ์กฐ๊ฑด์„ ํ‰๊ฐ€ (๋ณธ๋ฌธ ํ•œ ๋ฒˆ ์ด์ƒ ์‹คํ–‰) 
    • do...while
let count = 0;
do {
	count++;
    console.log(count);
} while(count<3);

console.log('end');

>> 1 2 3 'end'


let count = 3;
do {
	count++;
    console.log(count);
}while(count <3);

console.log('end');

>> 'end'
  • General loop
    • for
      • ํŠน์ • ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค
      • ์–ธ์–ด๋ณ„๋กœ ์ง€์›ํ•˜๋Š” ํ˜•์‹์ด ์žˆ๋‹ค.
        • [์ดˆ๊ธฐํ™”-์กฐ๊ฑด์‹-์ฆ๊ฐ๋ฌธ]์˜ ํ˜•์‹ (for(let ๋ฃจํ”„๋ณ€์ˆ˜ = 0; ๋ฃจํ”„๋ณ€์ˆ˜ <3; ๋ฃจํ”„๋ณ€์ˆ˜++))
          • C์–ธ์–ด ์œ ๋ž˜, while๋ฌธ๊ณผ ๋‹ค๋ฅด๊ฒŒ ํ•ด๋‹น ๋ฃจํ”„์™€ ๊ด€๋ จ๋œ loop ๋ณ€์ˆ˜ ์กด์žฌ
            • loop๋ณ€์ˆ˜์˜ ๋น„๊ต ๋ฐ ์ฆ๊ฐ์„ ์œ„ํ•œ ๋ณ„๋„ ๋ถ„๋ฒ• ๋ช…์‹œ ํ•„์š”
            • ==loop๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์นด์šดํŠธ๋ฅผ ๊ด€๋ฆฌ ํ•„์ˆ˜
          • ์ดˆ๊ธฐ๋ฌธ: loop ๋‚ด์—์„œ ์‚ฌ์šฉํ•  loop๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”
          • ์กฐ๊ฑด๋ฌธ: loop ๋‚ด ์ฝ”๋“œ ์ „, ์กฐ๊ฑด์„ ํ‰๊ฐ€ํ•˜์—ฌ loop๋ฅผ ์ง€์†ํ• ์ง€ ํŒ๋‹จ
          • ์ฆ๊ฐ๋ฌธ: loop ๋‚ด ์ฝ”๋“œ ํ›„, ์‹คํ–‰๋˜๋Š” ๋ฌธ์žฅ(๋ฃจํ”„๋ณ€์ˆ˜ ์ฆ๊ฐ ์šฉ๋„)
        • ์ง‘ํ•ฉ loopํ˜•์‹ (Foreach loop)
  • Collection loop
    • ์ปฌ๋ ‰์…˜ ์•ˆ์˜ ํ•ญ๋ชฉ๋“ค์„ ํšก๋‹จํ•˜๋Š” ์ œ์–ดํ๋ฆ„๋ฌธ
    • For๋ฌธ๊ณผ ๋‹ค๋ฅด๊ฒŒ, ๋ช…์‹œ์ ์œผ๋กœ ์นด์šดํ„ฐ(๋ฃจํ”„๋ณ€์ˆ˜)๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์ž ์žฌ์ ์ธ ์ˆœํ™˜ ํšŸ์ˆ˜ ์˜ค๋ฅ˜๋ฅผ ์˜ˆ๋ฐฉ (off-by-one error)
      • ์ฝ”๋“œ๋ฅผ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ ์ฝํž ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. 
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ collection loop 
      • for...in
        • ๊ฐ์ฒด์˜ ์—ด๊ฑฐ์†์„ฑ(enumerable)์„ ํ†ตํ•ด ์ง€์ •๋œ ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.
        • for([๋ณ€์ˆ˜] in [object]) { ... } //๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด์˜ key๊ฐ’์„ ๋ฐ˜ํ™˜
      • for...of
        • ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด(iterator)๋ฅผ ํ†ตํ•ด ๋ฐ˜๋ณตํ•˜๋Š” ๋ฃจํ”„๋ฅผ ๋งŒ๋“ ๋‹ค.
        • for([๋ณ€์ˆ˜] of [object]) { ... } //๋ณ€์ˆ˜๋Š” ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜(Array, Set, String, ...)
const foo = 'apple';

for(const i of foo){
	console.log(i);
}
>> 'a' 'p' 'p' 'l' 'e'

const foo = new Set();
foo.add('apple');
foo.add('banana');

for(const i of foo){
	console.log(i);
}
>> 'apple' 'banana'

const foo = {
	apple: '๐ŸŽ',
    banana: '๐ŸŒ',
};
for(let key in foo){
	console.log(key);
}

>> console.log(key);
  • Subroutine exit : return
    • break๋ฌธ
      • ์ œ์–ดํ๋ฆ„์˜ ์ข…๋ฅ˜ ์ค‘ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘๋‹จ ์ข…๋ฅ˜
      • ๋ฐ˜๋ณต๋ฌธ, switch๋ฌธ์„ ์ข…๋ฃŒ์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉ
      • ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด while, do-while, for, switch๋ฌธ ์ข…๋ฃŒํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๋„˜์–ด๊ฐ
    • continue๋ฌธ
      • ์ œ์–ดํ๋ฆ„์˜ ์ข…๋ฅ˜ ์ค‘ ํ˜„์žฌ ์‹คํ–‰ ๊ตฌ๋ฌธ์—์„œ ๋–จ์–ด์ง„ ํ•œ ๊ตฌ๋ฌธ์˜ ์ง‘ํ•ฉ์„ ์‹คํ–‰ ์ข…๋ฅ˜์— ์†ํ•œ๋‹ค.
      • while, do...while, for๋ฌธ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
      • ๊ฐ€์žฅ ์•ˆ์ชฝ์˜ while, do-while, for๋ฌธ์„ ๋‘˜๋Ÿฌ์‹ผ ๋ฐ˜๋ณต์„ ์ข…๋ฃŒ, ๋‹ค์Œ loop ์‹คํ–‰
      • ์ „์ฒด ๋ฃจํ”„ ์‹คํ–‰์„ ์ข…๋ฃŒํ•˜์ง€ ์•Š๋Š”๋‹ค.
        • while: ์กฐ๊ฑด๋ฌธ์œผ๋กœ ์ด๋™
        • for: ์ฆ๊ฐ๋ฌธ์œผ๋กœ ์ด๋™
  • Non-local control flow 
    • try...catch
    • throw
    • generator
    • async

์˜ˆ์™ธ์ƒํ™ฉ Exception

  • - ๋Ÿฐํƒ€์ž„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜๋„์น˜ ์•Š์€ ์ƒํ™ฉ์„ ๋œปํ•œ๋‹ค.
  • - ํ๋ฆ„ ์ œ์–ด ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ ์ƒํ™ฉ์ด๋ฏ€๋กœ, ์ด๋ฅผ ์ดํ•ดํ•˜์—ฌ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๋Œ€์‘ํ•ด์•ผ ํ•œ๋‹ค.
    • handling: ๋Œ€์‘ํ•œ๋‹ค์˜ ์˜๋ฏธ
    • control: ์˜ˆ์ƒํ•˜๊ณ  ์ง์ ‘ ์กฐ์ž‘ํ•œ๋‹ค๋Š” ์˜๋ฏธ
  • ์˜ˆ์™ธ ์ƒํ™ฉ์„ ํ•ธ๋“ค๋งํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด shut down๋  ์ˆ˜ ์žˆ๋‹ค. 
  • ์˜ˆ์™ธ์˜ ์›์ธ
    • ์–ธ์–ด ๋ ˆ๋ฒจ~ ์™ธ๋ถ€์š”์ธ์— ์˜ํ•œ ์˜ˆ์™ธ ์ƒํ™ฉ๊นŒ์ง€ ๋‹ค์–‘ํ•˜๋‹ค.
      • ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ์˜ ๋ฌธ์ œ / ํ•˜๋“œ์›จ์–ด, ๋””๋ฐ”์ด์Šค์˜ ๋ฌธ์ œ / ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†์ƒ / ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ์‹ค์ˆ˜ ...
  • ์˜ˆ์™ธ์˜ ์ข…๋ฅ˜
    • ECMAScript Error: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” Error Type
      • RangeError ๊ฐ’์ด ์ง‘ํ•ฉ์— ์—†๊ฑฐ๋‚˜, ํ—ˆ์šฉ๋ฒ”์œ„๊ฐ€ ์•„๋‹ ๋•Œ
      • ReferenceError ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜ ์ฐธ์กฐ ์‹œ
      • SyntaxError ๋ฌธ๋ฒ•์„ ์ง€ํ‚ค์ง€ ์•Š์•˜์„ ๋–„
      • TypeError ๊ฐ’์ด ๊ธฐ๋Œ€ํ•œ ์ž๋ฃŒํ˜•์ด ์•„๋‹ˆ์—ฌ์„œ ์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ 
    • DOMException: Web API ๋ ˆ๋ฒจ์—์„œ ๋ฐœ์ƒํ•˜๋Š” Error Type
      • NetworkError ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ
      • AbortError ์ž‘์—…์ด ์ค‘๋‹จ๋˜์—ˆ์„ ๋•Œ
      • TimeoutError ์ž‘์—… ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์—ˆ์„ ๋•Œ 
    • ๊ทธ ์™ธ ์˜ˆ์™ธ
      • ๊ฐœ๋ฐœ์ž๋„ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ˆ์™ธ ์ƒํ™ฉ
      • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์˜ˆ์ƒํ•˜์—ฌ ํ•ธ๋“ค๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Error๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์—๋Ÿฌ๋ฅผ ์ •์˜๋‚ด๋ฆฌ๊ณ  ํ•ธ๋“ค๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • throw๋ฌธ
      • ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉ, catch๋ธ”๋Ÿญ์—์„œ ์—๋Ÿฌ ๊ฐ์ฒด ํ•ธ๋“ค๋ง
      • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด
        • 1. ํ˜„์žฌ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ค‘์ง€
        • 2. ์—๋Ÿฌ๊ฐ์ฒด์™€ ํ•จ๊ป˜ ์—๋Ÿฌ๊ฐ€ throw
        • 3. ์ œ์–ดํ๋ฆ„์€
          • ํ˜ธ์ถœ์ž ์‚ฌ์ด์— catch๋ธ”๋ก์ด ์žˆ์œผ๋ฉด, catch๋ธ”๋ก์œผ๋กœ ์ „๋‹ฌ
          • ํ˜ธ์ถœ์ž ์‚ฌ์ด์— catch๋ธ”๋ก์ด ์—†์œผ๋ฉด, ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ
      • ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•˜์—ฌ throw๋ฌธ ์‚ฌ์šฉ -> throw ํ‘œํ˜„์‹
      • throw๋ฌธ ์ดํ›„์˜ ๋ช…๋ น๋ฌธ์€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
const foo = () => {
	console.log(1);
    thorw '์—ฌ๊ธฐ';
    console.log(2);
}

foo();

>> Error: ์—ฌ๊ธฐ
>> 1
  • Error ๊ฐ์ฒด
    • ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ Error ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      • new Error("์—๋Ÿฌ ๋ฉ”์„ธ์ง€")
      • Error.message
      • Error.name
    • ECMAScript ํ‘œ์ค€ ๋‚ด์žฅ ์˜ค๋ฅ˜ ์œ ํ˜•์ด ์žˆ๋‹ค.
const foo = () => {
	console.log(1);
    const customError = new Error();
    customError.name = "ErrorName";
    customError.message = '์—๋Ÿฌ๋ฐœ์ƒ';
    
    throw customError;
    
    console.log(2);
}

foo();

>> 1
>> ErrorName: ์—๋Ÿฌ๋ฐœ์ƒ

 

์—๋Ÿฌ catch

  1. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด
  2. ํ˜„์žฌ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ค‘์ง€
  3. ์—๋Ÿฌ๊ฐ์ฒด์™€ ํ•จ๊ป˜ ์—๋Ÿฌ๊ฐ€ throw
  4. ์ œ์–ดํ๋ฆ„์€
    • ํ˜ธ์ถœ์ž ์‚ฌ์ด์— catch๋ธ”๋ก์ด ์žˆ์œผ๋ฉด, catch๋ธ”๋ก์œผ๋กœ ์ „๋‹ฌ
    • ํ˜ธ์ถœ์ž ์‚ฌ์ด์— catch๋ธ”๋ก์ด ์—†์œผ๋ฉด, ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ
  • ์—๋Ÿฌ๋ฅผ catchํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•œ๋‹ค. 
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด, ์ˆœ์„œ๋Œ€๋กœ ์ฝœ ์Šคํƒ(call stack)์„ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„๋‚ด์–ด ๊ทธ ๊ณณ์—์„œ ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•œ๋‹ค. 

์ฝœ์Šคํƒ call stack

  • ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ
    • ์ถœ์ž…๊ตฌ๊ฐ€ ํ•˜๋‚˜์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(First In Last Out)
  • Call stack
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ ์ƒ์„ฑ๋˜๋Š” ์‹คํ–‰์ปจํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
    • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์Šคํƒ์ด ์Œ“์ด๊ณ , ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋ฉด, ์ฝœ์Šคํƒ์—์„œ ์Šคํƒ์„ ์ œ๊ฑฐํ•˜๋Š” ์›๋ฆฌ
  • ์—๋Ÿฌ throw๋˜๋ฉด
    • ์ฝœ์Šคํƒ์„ ํ™•์ธํ•˜์—ฌ, ํ•ธ๋“ค๋งํ•˜๊ณ  ์žˆ๋Š” catch๋ฌธ์ด ์žˆ๋Š” ์Šคํƒ์—์„œ ์ฒ˜๋ฆฌ 

try...catch๋ฌธ

  • try...catch๋ฌธ์€ ๋ธ”๋ก๋ฌธ ๋‚ด์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๋งก์„ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐ˜์‘ ๋ช…๋ น๋ฌธ์„ ์ง€์ •
    • try ๋ธ”๋ก์˜ ๋ช…๋ น๋ฌธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์‹คํŒจํ•˜๋ฉด, catch๋กœ ์ œ์–ด๊ถŒ์ด ๋„˜์–ด๊ฐ„๋‹ค.
    • try ๋ธ”๋ก์˜ ๋ช…๋ น๋ฌธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด, catch๋กœ ์ œ์–ด๊ถŒ์ด ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
  • catch๋ธ”๋Ÿญ์—์„œ ์ธ์ž๋กœ throw๋œ catchId๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • try{...} catch(catchID){...}
const foo = (value) => {
	if(value < 3) throw value;
    else console.log(value); 
};

const bar = (value) => {
	try {
    	foo(value); // ์˜ค๋ฅ˜ throw๋ผ์„œ catch๋ฌธ์œผ๋กœ ๋„˜์–ด๊ฐ
    } catch(catchID){
    	console.log('catch', catchID); 
        //>> 'catch' 2
    }
};

bar(2);

์ฝœ์Šคํƒ ์ค‘ ํ•˜๋‚˜์—์„œ catch๋ฌธ์—์„œ ์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋œ๋‹ค๋ฉด, ๋” ์ƒ์œ„์˜ ์ฝœ ์Šคํƒ์—์„œ๋Š” ๋”์ด์ƒ ์˜ˆ์™ธ๊ฐ€ ํƒ€๊ณ ์˜ฌ๋ผ์˜ค์ง€ ์•Š๋Š”๋‹ค. 

function functionC() {
  throw new Error("ํญํƒ„ ๋ฐœ์‚ฌ!"); // ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ ๋ฐœ์ƒ
}

function functionB() {
  try {
    functionC();
  } catch (e) {
    console.log("B์—์„œ ์ˆ˜์Šต ์™„๋ฃŒ: " + e.message); // ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ๋ฅผ ์žก์Œ!
  }
}

function functionA() {
  functionB();
  console.log("A๋Š” ์•„๋ฌด ์ผ ์—†์—ˆ๋‹ค๋Š” ๋“ฏ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค."); // ์‹คํ–‰๋จ!
}

functionA();

>> B์—์„œ ์ˆ˜์Šต ์™„๋ฃŒ: ํญํƒ„ ๋ฐœ์‚ฌ!

>> A๋Š” ์•„๋ฌด ์ผ ์—†์—ˆ๋‹ค๋Š” ๋“ฏ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. 

 

finally๋ธ”๋ก

  • finally๋ธ”๋ก์€ try๋ธ”๋ก์—์„œ ์˜ˆ์™ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋”๋ผ๋„, ์‹คํ–‰ํš๋‹ค.
  • ์˜ˆ์™ธ์ƒํ™ฉ์ด ๋ฐœ์ƒ๋˜๋ฉด: try -> catch -> finally
  • ์˜ˆ์™ธ์ƒํ™ฉ์ด ๋ฐœ์ƒ๋˜์ง€ ์•Š์œผ๋ฉด: try -> finally

์‚ฌ๋ก€
์™ธ๋ถ€์— ์˜์กด๋˜์–ด์„œ ๊ตฌํ˜„๋œ ๋กœ์ง์—์„œ ์‚ฌ์šฉ(์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์ƒํ™ฉ ๋Œ€์‘)

  • network ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ
  • ์—๋Ÿฌ๋ฅผ ๊ฐ์ง€ํ•ด์•ผ ํ•˜๋Š” ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง
    • ๋น„์ง€๋‹ˆ์Šค ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
  • ์œ ์ €๊ฐ€ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ