JavaScript 中应继承 Error 类定义自定义业务异常类,补充 code、module、data 等属性,并用 throw new BusinessException() 抛出;捕获时用 instanceof 判断并按 code 分类处理,避免抛字符串或普通对象。

在 JavaScript 中,可以用 throw 抛出自定义业务异常类,关键在于继承原生 Error 类,并补充业务相关属性(如错误码、模块名等),让异常更易识别、调试和统一处理。
定义自定义业务异常类
推荐继承 Error,确保具备堆栈信息和标准行为:
class BusinessException extends Error {
constructor(message, { code = 'BUSINESS_ERROR', module = 'unknown', data = null } = {}) {
super(message);
this.name = 'BusinessException';
this.code = code; // 业务错误码,如 'USER_NOT_FOUND'
this.module = module; // 模块标识,如 'auth' 或 'order'
this.data = data; // 可选附加数据,如失败的订单 ID
this.timestamp = Date.now();
// 重要:保留原始堆栈(尤其在 Node.js 或现代浏览器中)
if (Error.captureStackTrace) {
Error.captureStackTrace(this, BusinessException);
}
}
}
使用 throw 抛出实例
直接用 throw new BusinessException(...),语义清晰,便于后续捕获和分类:
function processOrder(orderId) {
if (!orderId) {
throw new BusinessException('订单 ID 不能为空', {
code: 'INVALID_ORDER_ID',
module: 'order',
data: { orderId }
});
}
if (orderId === 'CANCELLED') {
throw new BusinessException('订单已取消,无法处理', {
code: 'ORDER_CANCELLED',
module: 'order',
data: { orderId }
});
}
return { status: 'success' };
}
统一捕获与处理业务异常
在调用处或全局错误边界中区分处理:
立即学习“Java免费学习笔记(深入)”;
- 用
instanceof判断是否为业务异常,避免误捕系统错误 - 根据
code做差异化响应(如提示文案、重试逻辑、跳转路由) - 记录日志时带上
module和data,利于问题定位
try {
processOrder('CANCELLED');
} catch (err) {
if (err instanceof BusinessException) {
console.warn(`[${err.module}] ${err.code}: ${err.message}`, err.data);
switch (err.code) {
case 'INVALID_ORDER_ID':
alert('请检查订单信息');
break;
case 'ORDER_CANCELLED':
alert('该订单已取消');
break;
default:
alert('操作失败,请稍后重试');
}
} else {
// 非业务异常,可能是网络错误、语法错误等,可上报监控
console.error('非业务异常:', err);
}
}
小贴士:避免常见误区
- 不要只抛字符串或普通对象(
throw 'xxx'或throw { msg: 'xxx' }),会丢失堆栈和类型信息 - 不要在自定义类中覆盖
toString()或message的默认行为,除非有强需求;保持与Error兼容 - 若需支持旧环境(如 IE),注意
Error.captureStackTrace是 V8 特有,可忽略或做降级 - 前端可配合请求拦截器/响应拦截器自动识别
BusinessException并触发 Toast;后端(Node.js)可结合 Koa/Express 的错误中间件统一格式化返回


















