同步错误使用 try/catch/finally,你应该 throw Error 对象(而不是字符串),这样你就能获得堆栈跟踪。
js
try {
const data = JSON.parse(input);
} catch (err) {
if (err instanceof SyntaxError) handleBadJson(err);
else throw err; // re-throw what you can't handle
} finally {
cleanup(); // always runs
}
为什么这很重要
js
// async/await → wrap awaits in try/catch
async function load() {
try {
return await fetch(url).then(r => r.json());
} catch (err) { showError(err); }
}
// promises → use .catch
fetch(url).then(use).catch(showError);
一个常见的陷阱:try/catch 不会捕获异步回调
js
try {
setTimeout(() => { throw new Error("boom"); }, 0); // ❌ NOT caught
} catch (e) { /* never runs — the throw happens later, outside this stack */ }
setTimeout 回调在稍后的 tick 上运行,所以周围的 try 已经消失了。在回调内部处理错误。
全局安全网
js
window.addEventListener("unhandledrejection", e => log(e.reason)); // browser
process.on("unhandledRejection", err => log(err)); // Node
最佳实践
- 为了获得堆栈跟踪和
instanceof检查,请throwError(或自定义子类)。 - 在你能恢复的地方具体地
catch;让意外错误冒泡。 - 永远不要默默吞下错误(
catch (e) {})。始终记录或重新抛出。
