본문 바로가기

JAVASCRIPT

예외 처리

예외 처리

코드의 실행 흐름을 복구 할 수 있는 기능

동기식 코드에서의 예외 처리

try...catch...finally 구문을 사용하면 에러가 나더라도 코드의 실행을 지속

  • 에러가 안났을 때 : try - finally
  • 에러가 났을 때 : try - 에러 - catch - finally

실행순서

  1. 에러가 났을 때 복구할 코드를 try 블록 내부에 작성 (try 블록 바로 뒤에 finally 블로이 오면 무조건 실행)
  2. 코드의 실행 흐름이 try 에서 catch로 옮겨감.
try {
  console.log('try');
  new Array(-1); // RangeError: Invalid array length
} catch (e) {
  console.log('catch');
} finally {
  console.log('finally');
}

비동기식에서의 예외 처리

비동기 콜백

에러가 발생하는 순간 호출 스택을 되감는 과정을 거침. 이 과정 중 try 블록을 만나야 코드 실행 흐름을 원상복구
try 블록을 비동기 콜백 내부에 작성

setTimeout(() => {
  try {
    throw new Error('에러!');
  } catch (e) {
    console.error(e);
  }
});

Promise

  • pending - Promise : 객체에 결과값이 채워지지 않은 상태
  • fulfilled - Promise : 객체에 결과값이 채워진 상태
  • rejected - Promise : 객체에 결과값을 채우려고 시도하다가 에러가 난 상태

Promise 객체가 rejected 상태가 되면, 두 번째 인수로 넘겨준 콜백이 실행. 에러 객체가 첫 번재 인수로 주어짐

const p = new Promise(resolve => {
  const even = parseInt(prompt('짝수를 입력하세요'));
  if (even % 2 !== 0) {
    throw new Error('짝수가 아닙니다.');
  } else {
    resolve(even);
  }
});

p.then(even => {
  return '짝수입니다.';
}, e => {
  return e.message;
}).then(alert);


// catch 메소드를 통한 에러 처리 콜백 지정
p.then(even => {
  return '짝수입니다.';
}).catch(e => {
  return e.message;
}).then(alert);

비동기 함수

비동기 함수 내부에서는, rejected 상태가 된 Promise 객체를 동기식 예외 처리 방식과 동일하게
try...catch...finally 구문으로 처리할 수 있음

Promise 객체에 대해 await 구문을 사용하지 않는 경우, 에러가 발생해도 catch 블록으로 코드의 실행 흐름이 이동하지 않음

async function func() {
  try {
    const res = await fetch('https://nonexistent-domain.nowhere');
  } catch (e) {
    console.log(e.message);
  }
}

func(); // 출력 결과: Failed to fetch

'JAVASCRIPT' 카테고리의 다른 글

모듈  (0) 2020.07.31
비동기 프로그래밍  (0) 2020.07.30
큐, 스택, 트리 자료구조  (0) 2020.07.30
class  (0) 2020.07.30
내장 객체 및 생성자  (0) 2020.07.30