Post

JavaScript 예외처리

JS 예외처리

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

  • 네트워크 에러와 같이 코드와는 무관한 이유로 발생하는 에러 처리
  • JavaScript는 이로부터 코드의 실행 흐름을 원상복구할 수 있는 기능을 제공하며, try...catch...finally 구문을 사용하면 에러가 나더라도 코드의 실행을 지속할 수 있다

finally 블록은 catch 블록 실행 순서

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

에러 발생시키기

  • Error 생성자와 throw 구문을 사용해서 프로그래머가 직접 에러를 발생 시킬 수 있다
1
2
3
4
5
6
7
8
9
10
try {
  const even = parseInt(prompt('짝수를 입력하세요'));
  if (even % 2 !== 0) {
    throw new MyError(even, '짝수가 아닙니다.');
  }
} catch (e) {
  if (e instanceof MyError) {
    console.log(e.value);
  }
}

비동기식 코드에서의 에러 처리

  • 비동기식으로 작동하는 콜백의 내부에서 발생한 에러는, 콜백 바깥에 있는 try 블록으로는 잡아낼 수 없다.
1
2
3
4
5
6
7
try {
  setTimeout(() => {
    throw new Error('에러!');
  });
} catch (e) {
  console.error(e);
}
  • JavaScript 엔진은 에러가 발생하는 순간 호출 스택을 되감는 과정을 거친다.
  • 이 과정 중에 try 블록을 만나야 코드의 실행 흐름을 원상복구시킬 수 있다.
  • 위 예제에서 setTimeout에 넘겨진 콜백에서 에러가 발생하면, 호출 스택을 따라 올라가도 try 블록을 만나는 것이 아니므로, 코드의 실행 흐름이 catch 블록으로 옮겨지지 않는 것.

try 블록을 비동기 콜백 내부에 작성한다.

1
2
3
4
5
6
7
setTimeout(() => {
  try {
    throw new Error('에러!');
  } catch (e) {
    console.error(e);
  }
});
This post is licensed under CC BY 4.0 by the author.