JS 예외처리
동기식 코드에서의 예외 처리
- 네트워크 에러와 같이 코드와는 무관한 이유로 발생하는 에러 처리
- JavaScript는 이로부터 코드의 실행 흐름을 원상복구할 수 있는 기능을 제공하며,
try...catch...finally
구문을 사용하면 에러가 나더라도 코드의 실행을 지속할 수 있다
finally
블록은 catch
블록 실행 순서
- 에러가 안 났을 때:
try
- finally
- 에러가 났을 때:
try
- 에러 발생 - catch
- finally
에러 발생시키기
Error
생성자와 throw
구문을 사용해서 프로그래머가 직접 에러를 발생 시킬 수 있다
try {
const even = parseInt(prompt('짝수를 입력하세요'));
if (even % 2 !== 0) {
throw new MyError(even, '짝수가 아닙니다.');
}
} catch (e) {
if (e instanceof MyError) {
console.log(e.value);
}
}
비동기식 코드에서의 에러 처리
- 비동기식으로 작동하는 콜백의 내부에서 발생한 에러는, 콜백 바깥에 있는
try
블록으로는 잡아낼 수 없다.
try {
setTimeout(() => {
throw new Error('에러!');
});
} catch (e) {
console.error(e);
}
- JavaScript 엔진은 에러가 발생하는 순간 호출 스택을 되감는 과정을 거친다.
- 이 과정 중에
try
블록을 만나야 코드의 실행 흐름을 원상복구시킬 수 있다.
- 위 예제에서
setTimeout
에 넘겨진 콜백에서 에러가 발생하면, 호출 스택을 따라 올라가도 try
블록을 만나는 것이 아니므로, 코드의 실행 흐름이 catch
블록으로 옮겨지지 않는 것.
try
블록을 비동기 콜백 내부에 작성한다.
setTimeout(() => {
try {
throw new Error('에러!');
} catch (e) {
console.error(e);
}
});