JavaScript에서 프로미스 체인의 예외 처리
어떤 이유로든 우리의 프로미스가 오류와 함께 종료된다고 가정해 봅시다:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
이 경우 코드 실행은 오류 처리 함수가 있는
then 또는 (먼저 만나는 것에 따라)
첫 번째 catch로 즉시 이동합니다.
첫 번째 상황의 예시입니다:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// 실행이 여기로 즉시 이동합니다
}
).then(
function(result) {
console.log(result);
}
);
두 번째 상황의 예시입니다:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// 실행이 여기로 즉시 이동합니다
}
).then(
function(result) {
console.log(result);
}
);
처리 함수에는 두 가지 선택지가 있습니다:
예외 상황을 처리할 수 있다면,
return을 통해 결과를 반환하고
실행은 체인을 따라 계속 진행됩니다.
오류를 처리할 수 없다면,
아무것도 반환하지 않거나
throw를 통해 예외를 발생시킬 수 있습니다.
이 경우 실행은 다음 오류 핸들러
(먼저 만나는 then 또는 catch)로
이동합니다.
일반적으로 체인의 모든 오류는
한 곳에서 처리됩니다: 체인 끝에
catch를 배치합니다:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// 오류 발생 시 여기에 도달합니다
}
);
예외는 프로미스 자체에서 발생하거나
체인의 어떤 부분에서든 throw를 통해
발생시킬 수 있습니다:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (allGood) {
return result + '2';
} else {
throw new Error('error'); // 가장 가까운 핸들러로 이동합니다
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// 가장 가까운 핸들러
}
);
catch는 정확히 오류 진단을 위해
필요하다는 점을 명심하세요: 오류가 해결 가능한지 여부입니다.
오류가 해결 가능하다면, catch는
그 해결책을 바로 다음 then에 전달해야 합니다.
해결할 수 없는 경우 (또는 해당 catch가
해결 방법을 단순히 모르는 경우), 우리는
아무것도 반환하지 않거나 예외를 발생시켜야 합니다:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (errorSolvable) {
return 'data'; // 다음 then으로 보냅니다
} else {
// 아무것도 반환하지 않거나 예외를 발생시킵니다
}
}
).then(
function(result) {
// 여기서 오류를 해결합니다
}
);