DEV Community

Origami
Origami

Posted on

Promise/async関数でthrowとtry~catchはやめておこう

こんにちは。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はやめておきましょう。

Top comments (0)