問題
非同期関数を呼び出す時、呼び出し元で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();
解決方法
呼び出し先の関数で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();
参考