Promise/async関数でthrowとtry~catchはやめておこう
Origami
Posted on February 11, 2020
こんにちは。Twitterで完全に俺の意見ということが判明しましたが、残しておきます
async関数の場合
const f1 = async () => {
return await Promise.reject(new Error("e"));
};
const f2 = async () => {
throw new Error("e");
};
f1()
.catch(e => console.log(e));
try {
f2();
} catch (e) {
console.log(e);
}
さて、間違っている箇所がわかるでしょうか?
実行すればすぐにわかることですが、async funciton
の中で投げられた例外はPromise.prototype.catch()
でないと受け取ることができません。そもそもこのような間違いを犯さないためにも、Promise
の中のエラー送出はPromise.reject()
を利用すべきです。
Promiseの場合
前を踏まえれば当然次のようなコードになります。
const f1 = () => new Promise(() => {
throw new Error("e")
})
const f2 = () => new Promise((resolve, reject) => {
reject(new Error("e")
})
f1().catch(e => console.log(e));
f2().catch(e => console.log(e));
終わり。asyncの中でthrow new Error()
、asyncの利用側でtry~catch
はやめておきましょう。
💖 💪 🙅 🚩
Origami
Posted on February 11, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.