Error handling has a quiet problem. You catch an error deep in a call stack, wrap it in something more descriptive, and rethrow. The caller gets a meaningful message — but the original error, with its stack trace and details, is gone.

async function loadUser(id) {

try {

const res = await fetch(`/api/users/${id}`);

if (!res.ok) throw new Error(`HTTP ${res.status}`);