예외 처리
코드의 실행 흐름을 복구 할 수 있는 기능
동기식 코드에서의 예외 처리
try...catch...finally 구문을 사용하면 에러가 나더라도 코드의 실행을 지속
- 에러가 안났을 때 : try - finally
- 에러가 났을 때 : try - 에러 - catch - finally
실행순서
- 에러가 났을 때 복구할 코드를 try 블록 내부에 작성 (try 블록 바로 뒤에 finally 블로이 오면 무조건 실행)
- 코드의 실행 흐름이 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 |