非同期でエラーを起こす関数を用意
1 秒後に Promise を reject

async function causeAsyncError() {
return new Promise((ok, ng) => setTimeout(ng, 1000))
}

try の中で呼び出しても非同期なものは catch されない

async function f1() {
try {
causeAsyncError()
} catch (err) {
console.log("catch")
}
}

f1()
// uncaught error

返り値を await すると catch される

async function f2() {
try {
await causeAsyncError()
} catch (err) {
console.log("catch")
}
}

f2()
// catch

f1 を呼び出す側で await しても効果なし

try {
await f1()
} catch (err) {
cosnole.log("catch")
}
// uncaught error

f1 の Promise は causeAsyncError の結果を待たずに解決される
ループの中などで await させたくない場合は個々に catch メソッド使うことになる

async function f1_() {
try {
causeAsyncError().catch(e => console.log("catch"))
} catch (err) {
console.log("catch")
}
}

f1_()
// catcch