본문 바로가기
JavaScript

[Javascript] 예외처리문, 재귀함수, promise 객체, asysn와 await

by 동복이 2023. 3. 30.

 

try catch문

try catch문은 실행중인 코드에 예외상황(오류)이 발생해도 프로그램이 종료되지 않고 실행 유지를 해주기 때문에 프로그램의 안정성을 높힐 수 있다. 일반적인 구조는 try 부분에 예외가 발생 할 수 있을 코드를 작성하고 catch 부분에 예외가 발생했을때 처리할 코드를 작성하여 준다. 간단한 예를 들어 실습을 진행해보자.

// try-catch문
try {
오류가 발생할 거 같은 코드 작성하는 곳
} catch (error) {
오류가 발생했을때 실행되는 코드를 작성하는 곳
}

 

trycatch.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div>
      <input type="text" class="dev" />
      <button onclick="myStr()">클릭</button>
      <p class="message"></p>
    </div>
  </body>
  <script src="./trycatch.js"></script>
</html>

trycatch.js

function myStr() {
  let devValue = document.querySelector(".dev").value;
  try { 
    if (devValue == "") throw "숫자를 입력해주세요.";

    if (isNaN(devValue)) throw "잘못 입력하였습니다. 숫자를 입력해주세요.";
    
  } catch (error) {
    document.querySelector(".message").innerHTML = error;
  }
}

 

결과

  • 공간이 비어있는 상태로 누르면 input 아래 글씨 출력
  • 숫자가 아닌 문자열 입력시 input아래 글씨 출력

Document


 

재귀함수

재귀함수는 함수가 자기자신은 호출하는 함수를 말한다. 자기자신을 반복적으로 호출하기 때문에 종료조건을 반드시 입력해 주어야한다.

 

function add(a) {
  if (a < 5) {
    add(a + 1);
    console.log(a);
  }
}
add(0);

0을 전달하여 0부터 출력될거 같지만 4부터 출력된다. 함수의 실행 컨택스트 때문(함수의 실행 컨택스트는 스택 자료구조를 이용해서 관리)

 

재귀함수를 활용한 피보나치 수열 만들기

let fiArr = [];
function fibonacci(n) {
  if (n < 2) return n;
  return fibonacci(n - 1) + fibonacci(n - 2);
}

for (let i = 0; i < 20; i++) {
  fiArr += fibonacci(i) + " ";
  console.log(fibonacci(i));
  if (i == 19) {
    console.log(fiArr);
  }
}

 

Promise 객체

비동기 처리를 위한 객체이다. 

 

function testPromise(num) {
  // 함수값에 resolve, reject 두가지 매개변수를 받음
  // resolve() 함수는 처리가 완료되면 반환
  // reject() 함수는 오류나면 반환
  return new Promise(function (res, rej) {
    try {
      if (num > 10) rej({ date: "over" });

      setTimeout(function () {
        res(num + 10);
      }, num * 1000);
    } catch (error) {
      rej(error);
    }
  });
}

testPromise(5)
  .then(function (date) {
    console.log(date);
    // 데이터를 가져오고 처리할 구문을 작성
    return testPromise(date);
  })
  // res를 실행하면 then() 메소드가 실행
  .then(function (date) {
    console.log(date);
  })
  // rej를 실행하면 catch() 메소드 실행
  .catch(function (error) {
    console.log(error);
  });

 

 

async await

async await는 비동기 처리를 좀 더 간편하고 직관적으로 처리할 수 있게 해주는 문법으로 둘이 한쌍으로 붙어다니므로 같이 써야한다.

 

// 위에 썼던거 다시쓰기
function testPromise(num) {
  // 함수값에 resolve, reject 두가지 매개변수를 받음
  // resolve() 함수는 처리가 완료되면 반환
  // reject() 함수는 오류나면 반환
  return new Promise(function (res, rej) {
    try {
      if (num > 10) rej({ date: "over" });

      setTimeout(function () {
        res(num + 10);
      }, num * 1000);
    } catch (error) {
      rej(error);
    }
  });
}

// async 와 await는 짝으로 붙어 다닌다. 같이써야함
async function asyncFun() {
  try {
    // await 뒤에 promise 객체
    let temp = await testPromise(3);
    // res나 rej이 처리될때까지 기다렸다 출력
    console.log(temp);

    temp = await testPromise(temp);
    // await + promise = promise를 기다리고 resolve 값을 반환
    console.log(temp);
  } catch (error) {}
}
asyncFun();

 

728x90