async/await Error Handling Best Practices in JavaScript
try/catch with await is clean but has best practices. Here is how to handle errors well.
async/await Error Handling Best Practices in JavaScript
try/catch with await is the cleanest error handling for async code. Here are the best practices.
1. Always Use try/catch
async function main() { try { const data = await fetch("/api"); render(data); } catch (err) { console.error(err); } }
2. Recover with Fallbacks
async function main() { let data; try { data = await fetch("/api"); } catch { data = fallbackData; } render(data); }
3. Re-throw to Propagate
async function fetchUser(id) { try { const res = await fetch(`/api/${id}`); return res.json(); } catch (err) { console.error("fetchUser failed:", err); throw err; // propagate to caller } }
4. Do Not Swallow Errors
// bad: swallowing try { await fetch("/api"); } catch {} // good: at least log try { await fetch("/api"); } catch (err) { console.error(err); }
5. Use a Helper for Go-style Error Handling
async function to(promise) { try { const data = await promise; return [data, null]; } catch (err) { return [null, err]; } } const [data, err] = await to(fetch("/api")); if (err) handleError(err); else render(data);
The Takeaway
Always use try/catch with await. Recover with fallbacks. Re-throw to propagate. Do not swallow errors. Use a to(promise) helper for Go-style error handling (avoids nested try/catch).
Use try/catch around the await calls. If any await rejects, the catch block runs with the rejection reason. try/catch also catches thrown errors inside the try block.
Assign a fallback value in the catch block, then continue: try { data = await fetch(); } catch { data = fallback; } render(data);. The function continues with the fallback.
Re-throw the error in the catch block: catch (err) { console.error(err); throw err; }. The caller can catch it with their own try/catch.
Yes. catch {} with no logging or handling hides bugs. At minimum, log the error: catch (err) { console.error(err); }. Silent failures make debugging very hard.
Use a to(promise) helper that returns [data, null] or [null, err]. Then: const [data, err] = await to(fetch()); if (err) handleError(err); else render(data);. This is Go-style error handling.
Ready to master React completely?
Want to upskill yourself, crack your next interview, and get your dream job? Join our comprehensive course to dive deeper with high-quality video tutorials, solve interview questions, and a premium community.
Master React
Want to upskill yourself, crack your next interview, and get your dream job? Join our comprehensive course.

