프라미스가 거부되면 제어흐름이 가까운 rejection핸들러로 넘어가기 떄문에, 프라미스 체인을 사용하면 에러를 쉽게 처리할 수 있음
fetch('존재하지않는 주소') // 거부
.then(response => response.json())
.catch(err => alert(err)) // TypeError : failt to fetch
.catch 에서 에러를 처리
프라미스 executor와 프라미스 핸들러 코드 주위에는 '암시적 try...catch'가 있음
new Promise((resolve, reject) => {
throw new Error('에러 발생!');
}).catch(alert); // 에러 발생!
===
new Promise((resovle, reject) => {
reject(new Error('에러 발생!'));
}).catch(alert); // 에러발생!
executor주위에 암시적 try..catch는 에러를 잡고, 에러를 거부상태의 프라미스로 변경시킴
체인 마지막에 .catch는 try...catch와 유사한 역할을 함
.then 핸들러를 원하는 만큼 사용하다 마지막에 .catch를 붙이면 .then 핸들러에 발생한 모든 에러를 처리할 수 있음
에러가 성공적으로 처리되면 가까운 곳에 있는 .then 핸들러로 제어 흐름이 넘어감
new Promise((resolve, reject)) => {
throw new Error('에러 발생!');
}).catch(function (error) {
alert('에러가 잘 처리되었습니다.)
}).then(() => alert('다음 핸들러가 실행됩니다.'));
catch가 정상적으로 종료되었기 떄문에 다음 성공핸들러 .then이 호출됨
에러가 발생하면 프라미스는 거부상태가 되고, 실행 흐름은 가까운 rejection 핸들러로 넘어감
예외를 처리해줄 핸들러가 없으면 에러가 '갇히게 됨'
이런 경우 unhandledrejection
이벤트로 잡을 수 있음
window.addEventListener('unhandlerdrejection', function (event) {
alert(event.promise) ; // [object Promise] 에러를 생성하는 프라미스
alert(event.reason) ; // Error: 에러 발생!
})
new Promise(function () {
throw new Error('에러 발생'!');
});