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 弹窗提示)。










