0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavaScript の Promise, await, async 時のエラー捕捉について

Posted at

new Promise() を返す関数内でのエラーは onError では拾えない。

window.addEventListener('error', (msg, file, no) => {
  alert(['onError', msg.message, file, no].join("\n--------\n"))
})

window.addEventListener('unhandledrejection', (evt) => {
  alert(['onUnhandledrejection', evt.reason.stack].join("\n--------\n"))
})

// onErrorでは拾えない。onUnhandledrejection では拾える。
new Promise((resolve,reject)=>{ throw new Error('xxx') })

エラーを捕捉するにはどうするか。

function p1(){ return new Promise((resolve,reject)=>{
  throw new Error('xxx')
})}
//-----
;(async()=>{
  try{ p1() }catch(err){ alert(err) } // × awaitで無い場合は拾えない
  try{ await p1() }catch(err){ alert(err) } // ○ await なら拾える
  p1().catch((err)=>{ alert(err) }) // ○ .catch()でも拾える
  
  try{
    await p1().catch((err)=>{ alert(err) }) // ○ こっちだけで拾える
  }catch(err){
    alert(err)
  }
  
  try{
    await p1().catch((err)=>{ alert(err); throw err }) // ○ 拾える
  }catch(err){
    alert(err) // ○ throw してるのでこちらでも拾える
  }
})();

new Promise() を返す関数内のエラーは自分で捕捉するしかない。
親には伝播しない。

function p2(){ return new Promise((resolve,reject)=>{
  p1()
})}
p2().catch((err)=>{ alert(err) }) // p1 のエラーは p2 に伝わらないので捕捉できない

伝播させるには手動で上げるしかない。

function p2(){ return new Promise((resolve,reject)=>{
  p1().catch(reject) // こちらで捕捉して上に上げる
})}
p2().catch((err)=>{ alert(err) }) // 捕捉できる

new Promise() では await(try ~ catch) と .catch() は直接の 自分自身 内のエラーのみ反応する。

new Promise() 内で new Promise() を使用するとそれはもう別世界でエラーは自動では伝播しないので注意。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?