-
promise catch errorJavaScript/입 속의 검은 잎 2022. 10. 5. 18:32
function 몇초후프로미스에러발생(sec){ return new Promise((resolve,reject)=>{ setTimeout(()=>{ reject('error!'); }, sec*1000); }) } try{ 몇초후프로미스에러발생(3); } catch(err){ console.error(err) } """ node:internal/process/promises:279 triggerUncaughtException(err, true /* fromPromise */); ^ [UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "error!".] { code: 'ERR_UNHANDLED_REJECTION' } """
에러가 안잡힌다.
3초 딜레이가 콜스택에서 try catch 구문을 지나치기 때문.
function 몇초후프로미스에러발생(sec){ return new Promise((resolve,reject)=>{ setTimeout(()=>{ reject('error!'); }, sec*1000); }) } 몇초후프로미스에러발생(3).catch((err)=>{ console.log(err); }) // error!
try catch 구문이 아니라 프로미스 함수 (then, catch 등)로 에러처리를 했다.
실행이 완료되고 콘솔에 reject 안의 문자열이 찍힌다.
프로미스의 편리한 점은 체인형태로 프로미스 함수를 계속 넣을 수 있다는 것이다.
그런데 이 때의 체인은 다른 객체나 배열에 메서드체인을 걸 때처럼 같은 객체를 대상으로 하는 것이 아니다.
프로미스의 체인은 단계마다 새로운 프로미스 인스턴스를 반환한다.
아래에서 1st catch만 콘솔에 찍힌 것은, 그 해당 프로미스 객체의 에러가 잡혀서 두번째 것을 넘어갔기 때문이 아니다.
첫번째 catch문이 리턴한 새로운 프로미스에 문제가 없었기 때문에 두번째 catch가 반응하지 않은 것이다.
function 몇초후프로미스에러발생(sec){ return new Promise((resolve,reject)=>{ setTimeout(()=>{ reject('error!'); }, sec*1000); }) } 몇초후프로미스에러발생(3) .catch((err)=>{ console.log('1st catch', err); }) .catch((err)=>{ console.log('2nd catch', err); }) //1st catch error!
function 몇초후프로미스에러발생(sec){ return new Promise((resolve,reject)=>{ setTimeout(()=>{ reject('error!'); }, sec*1000); }) } 몇초후프로미스에러발생(3) .catch((err)=>{ console.log('1st catch', err); throw new Error('또 에러!') }) .catch((err)=>{ console.log('2nd catch', err); }) //1st catch error! //2nd catch Error: 또 에러!
function 몇초후프로미스에러발생(sec){ return new Promise((resolve,reject)=>{ setTimeout(()=>{ reject('error!'); }, sec*1000); }) } 몇초후프로미스에러발생(3) .then(()=>{ console.log('done!!!'); }, e => { console.log('1st catch in then') throw new Error('throw in then') } ) .catch((err)=>{ console.log('2nd catch', err); }) //1st catch in then //2nd catch Error: throw in then
'JavaScript > 입 속의 검은 잎' 카테고리의 다른 글
클래스, super, 오버라이딩 (0) 2022.10.12 async/await (0) 2022.10.05 try catch error (1) 2022.10.05 json 객체 (0) 2022.10.05 set() (0) 2022.09.28