javaScript异常处理需注意try-catch仅捕获同步错误,异步错误应使用promise.catch或async/await配合try-catch处理;catch中应判断Error类型避免误处理;throw应使用Error对象或自定义错误类以保留调用栈;finally块始终执行,若包含return会覆盖之前返回值,应避免在其中使用return或throw;全局监听window.error和unhandledrejection可用于收集未捕获异常,但不能替代正常错误处理。

javascript中的异常处理主要通过 try…catch…finally 结构和 throw 语句实现。虽然语法简单,但在实际使用中有一些关键细节容易被忽视,影响代码的健壮性和可维护性。
正确使用 try-catch 捕获异常
try-catch 是捕获运行时错误的主要方式。需要注意的是,它只能捕获同步代码中的异常。
• 异步代码中的错误不会被外层 try-catch 捕获,比如 setTimeout 或 Promise 中抛出的错误。 • 如果需要捕获异步错误,应使用 Promise 的 .catch() 方法或 async/await 配合 try-catch。 • 在 catch 块中,最好判断 error 的类型再做处理,避免误处理非预期错误。
示例:
try { jsON.parse('无效的json'); } catch (error) { if (error instanceof SyntaxError) { console.log('JSON格式错误'); } else { throw error; // 不是预期错误,重新抛出 } }
throw 抛出合适的错误类型
使用 throw 时,建议抛出 Error 对象而不是原始值,这样能保留调用栈信息,便于调试。
立即学习“Java免费学习笔记(深入)”;
• 直接 throw ‘字符串’ 虽然合法,但不利于堆栈追踪。 • 应该使用 new Error()、TypeError、ReferenceError 等标准错误类型。 • 可以自定义错误类来表示特定业务异常。
推荐写法:
if (!user) { throw new Error('用户不存在'); } // 自定义错误 class AuthError extends Error { constructor(message) { super(message); this.name = 'AuthError'; } }
finally 块的行为细节
finally 块无论是否发生异常都会执行,常用于清理资源,但需注意其执行时机和返回值的影响。
• 如果 try 或 catch 中有 return 语句,finally 仍会执行,且在 return 之后暂停,等 finally 执行完再返回。 • 若 finally 中也包含 return,它将覆盖 try/catch 中的返回值。 • 避免在 finally 中使用 return、throw,除非确实需要改变流程。
全局异常监听作为兜底
未被捕获的异常会导致程序崩溃,可以通过全局事件监听来收集错误信息。
• 浏览器中使用 window.addEventListener(‘error’) 捕获脚本错误。 • 对于 Promise 中未处理的拒绝,使用 window.addEventListener(‘unhandledrejection’)。 • 在 node.js 中监听 process.on(‘uncaughtException’) 和 process.on(‘unhandledRejection’)。
这些机制不能替代正常的错误处理,而是用于日志记录和监控。
基本上就这些。掌握这些细节能让异常处理更可靠,避免遗漏关键错误或干扰正常逻辑。


