JavaScript 的 try-catch-finally 是处理运行时异常的核心机制:try 包裹可能出错的同步代码,catch 捕获并处理错误对象,finally 无论成败均执行清理操作;需避免包裹异步回调,异步需配合 await 使用。

JavaScript 中的 try-catch-finally 是处理运行时异常的核心机制,它让程序能在出错时优雅降级、释放资源、保持可控流程,而不是直接崩溃。
try 块:包裹可能出错的代码
try 里放你预期可能抛出错误的操作,比如网络请求、JSON 解析、对象属性访问等。只要其中任意一行抛出异常(包括 throw 语句或原生错误),执行就立刻中断,并跳转到 catch 块。
- 不要把大量无关逻辑塞进
try,只包裹真正可能失败的最小范围代码 - 避免在
try中写异步回调(如setTimeout或fetch().then()),因为它们不在当前同步执行流中,try-catch捕不到 - 示例:JSON.parse('{ "name": }') 会立即抛
SyntaxError,被try捕获
catch 块:接收并处理具体错误
catch 接收一个参数(通常叫 error 或 err),它是 Error 实例或自定义错误对象。你可以检查它的 name、message、stack 等属性做差异化处理。
- 别只写
console.log(err)就完事,至少要记录关键信息或给出用户可理解的提示 - 可以嵌套多个
try-catch,或用if/else判断err.name(如'TypeError'、'NetworkError')来分路径处理 - 若当前
catch无法解决,可重新抛出:throw err,让外层捕获
finally 块:无论成败都执行的清理操作
finally 总是执行,不管 try 正常结束、catch 被触发,还是中间有 return。适合关连接、清定时器、重置 UI 状态等“善后”任务。
-
finally中的return会覆盖try或catch中的返回值(慎用) - 即使
try里有return 42,finally还是会运行;若finally也return 'done',函数最终返回的就是'done' - 常见用途:关闭
WebSocket、清除loading状态、还原表单禁用状态
与流程控制结合的关键细节
异常捕获不是独立于逻辑之外的“补丁”,而是流程设计的一部分。例如在循环中处理一批数据:
- 想跳过单个失败项继续执行?把
try-catch放在循环体内,而不是包整个for - 想在首次失败时中止整个流程?把
try-catch放在外层,catch里break或return - 异步场景需配合
async/await:只有await后的 Promise reject 才会被try-catch捕获,不能直接try { fetch(...) }


















