JavaScript 中 Error 对象是处理运行时异常的核心,支持创建抛出、try…catch 捕获、内置错误类型及自定义错误类,实现错误的可读、可控、可追踪。

JavaScript 中的 Error 对象是捕获和处理运行时异常的核心 工具,它不仅能帮你定位问题,还能自定义错误逻辑。关键不在于“有没有报错”,而在于“怎么让错误变得可读、可控、可追踪”。
一、创建并抛出 Error 对象
用 throw new Error(message) 主动触发异常,message 建议具体明确,避免只写“出错了”:
throw new Error("用户未登录,无法提交表单")throw new Error(` 接口 ${url} 返回状态码 ${status}`)
注意:throw 后代码不会执行,会立即中断当前流程,交由最近的 catch 或全局机制处理。
二、用 try…catch 捕获并处理
把可能出错的代码包进 try,在 catch 中接收 Error 实例,从中提取有用信息:
-
error.message:开发者写的提示文字(最常用) -
error.name:错误类型名,如"TypeError"、"SyntaxError" -
error.stack:调用 栈,用于定位出错位置(开发调试时非常关键)
示例:
try {JSON.parse("{invalid: json}"); } catch (err) {console.error(`${err.name}: ${err.message}`); // 输出:SyntaxError: Unexpected token i in JSON at position 1 }
三、常见的内置错误类型
除了通用 Error,JS 还预置了 7 种标准子类,每种对应一类典型问题:
- EvalError:已废弃,现代代码中基本不用
- SyntaxError:代码解析失败,比如少括号、错别字(
if (x = 1)不报此错,那是逻辑错) - ReferenceError:访问未声明的变量,如
console.log(undeclaredVar) - TypeError:操作不兼容的类型,如
null.toString()或42.toUpperCase() - RangeError:数值超出有效范围,如
new Array(-1)或递归过深 - URIError:
encodeURI()或decodeURI()参数格式非法 - AggregateError:ES2020 新增,用于
Promise.allSettled()等场景中聚合多个错误
四、自定义错误类型(提升可维护性)
当业务逻辑复杂时,建议继承 Error 创建专属类,便于后续用 instanceof 区分处理:
class ApiError extends Error {constructor(message, statusCode) {super(message); this.name = "ApiError"; this.statusCode = statusCode; } } // 使用 throw new ApiError("服务器忙,请稍后重试", 503);
这样你就能在 catch 中判断:if (err instanceof ApiError) {……},实现差异化响应(比如自动重试 vs 弹窗提示)。