1
1

More than 1 year has passed since last update.

Promise Executor の非同期例外

Last updated at Posted at 2023-09-16

JavaScript の Promise での非同期例外の扱い方を簡単に整理してみました。Promise Executor の中から、 throw で Error を投げる方法と、reject で Error を返す方法を比べてみました。結論から言うと、Promise Executor から Error を返す時は、throwではなくrejectを使う方が安全です。

Promise の基礎知識 -- Qiita
Promise でのエラーハンドリング

1.同期エラーの場合は常にOK

同期エラーの場合は、throw と reject のどちらで返した場合も補足できます

  • throwでErrorを投げた場合 OK
OK
new Promise(function(resolve, reject) {
  throw new Error("Whoops!");
}).catch(err => console.log(err.message)); // Error: Whoops!
  • rejectでErrorを返した場合 OK
OK
new Promise(function(resolve, reject) {
  reject(new Error("Whoops!"));
}).catch(err => console.log(err.message)); // Error: Whoops!

2.非同期エラーの場合は、rejectの場合のみOK

同期エラーの場合は、reject で返した場合のみ補足できます

  • throwでErrorを投げた場合 NG
NG
new Promise(function(resolve, reject) {
  setTimeout(() => {
    throw new Error("Whoops!");
  }, 1000);
}).catch(err => console.log(err.message)); // Error: Whoops!

エラーメッセージ
VM87:3 Uncaught Error: Whoops!
at :3:11

非同期で throw で Error を投げられると、Promise catchメッソドでは補足できないようです。

  • rejectでErrorを返した場合 OK
OK
new Promise(function(resolve, reject) {
  setTimeout(() => {
    reject(new Error("Whoops!"));
  }, 1000);
}).catch(err => console.log(err.message)); // Error: Whoops!

非同期で reject で Error を返すと、Promise catchメッソドで補足できるようです。

3.非同期エラーの場合は、try/catchでも、rejectの場合のみOK

try/catch で処理する方法と、Promise catchメッソドの Rejection handler で処理する方法を実験しました。この場合もreject で返した場合のみ補足できます。

  • throwでErrorを投げた場合 NG
NG
function promiseFunc() {
  return new Promise(function(resolve, reject) {
    setTimeout(() => {
      throw new Error("Whoops!");
    }, 1000);
  })
}

try {
  await promiseFunc();
} catch (err) {
  console.log(err.message)
}

エラーメッセージ
VM91:4 Uncaught Error: Whoops!
at :4:13

非同期で throw で Error を投げられると try/catch でも補足できないようです。

  • rejectでErrorを返した場合 OK
OK
function promiseFunc() {
  return new Promise(function(resolve, reject) {
    setTimeout(() => {
      reject(new Error("Whoops!"));
    }, 1000);
  })
}

try {
  await promiseFunc();
} catch (err) {
  console.log(err.message)
}

非同期で reject で Error を返すと、try/catchでも補足できるようです。

今回は以上です。

1
1
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
1
1