Start here. This is the direct spoken answer to practice first.
Overview
A try block handles an awaited rejection inside it. It cannot catch a promise that was started and detached without being awaited or returned.
An async function always returns a promise. Throwing inside it rejects that promise, and awaiting a rejected promise throws at the await point. A .then handler that throws also returns a rejected promise. I trace which promise is returned or awaited; if code starts asynchronous work without either, an outer try/catch may finish before the rejection occurs.