JavaScript の Promise での非同期例外の扱い方を簡単に整理してみました。Promise Executor の中から、 throw で Error を投げる方法と、reject で Error を返す方法を比べてみました。結論から言うと、Promise Executor から Error を返す時は、throwではなくrejectを使う方が安全です。
Promise の基礎知識 -- Qiita
Promise でのエラーハンドリング
1.同期エラーの場合は常にOK
同期エラーの場合は、throw と reject のどちらで返した場合も補足できます
- throwでErrorを投げた場合 OK
new Promise(function(resolve, reject) {
throw new Error("Whoops!");
}).catch(err => console.log(err.message)); // Error: Whoops!
- rejectでErrorを返した場合 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
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
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
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
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でも補足できるようです。
今回は以上です。