0
0

More than 1 year has passed since last update.

【JavaScript】非同期関数内のエラーを呼び出し元でキャッチしたい

Last updated at Posted at 2023-01-18

問題

非同期関数を呼び出す時、呼び出し元でtry/catchを書いてもエラーをcatchできず、困っていました。

以下の場合、関数subだけではなくて関数func1でも例外をキャッチしたい!

async function sub() {
  console.log("subが呼ばれました");
  try {
    const a = 0;
    a = 1; // エラー発生!
    res = a;
    return res;
  } catch (e) {
    console.error("subでエラーが発生しました", e); // キャッチされる
  }
}

async function func1() {
  try {
    console.log("func1が呼ばれました");
    const result = await sub(); // この関数内でエラー発生
    console.log("resultにsubの結果を格納しました");
  } catch (e) {
    console.error("func1でエラーが発生しました", e); // キャッチしたいけどされない!
  }
}

func1();

実行結果
キャッチされない.png

解決方法

呼び出し先の関数でcatchした例外をそのままthrowする(例外の再発生)
具体的には、throw eを追記する。

再度発生した例外は、利用者がわかるように、囲んでいる関数または最上位にいたるまで伝播します。

参考サイトより

async function sub() {
  console.log("subが呼ばれました");
  try {
    const a = 0;
    a = 1; // エラー発生!
    res = a;
    return res;
  } catch (e) {
    console.error("subでエラーが発生しました", e); // キャッチされる
    throw e; // これだけ追記
  }
}

async function func1() {
  try {
    console.log("func1が呼ばれました");
    const result = await sub(); // この関数内でエラー発生
    console.log("resultにsubの結果を格納しました");
  } catch (e) {
    console.error("func1でエラーが発生しました", e); // キャッチされる!
  }
}

func1();

実行結果
キャッチされる.png

参考

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