JavaScript自定义错误需继承Error类并正确设置name、message和stack,添加code等结构化属性而非拼接message,推荐用工厂函数统一创建,避免抛字符串或破坏堆栈。

在 JavaScript 中抛出自定义错误对象,核心是继承内置 Error 类,并正确设置 name 和 message,同时确保堆栈信息(stack)不丢失。规范写法能提升错误可读性、便于调试和统一错误处理。
继承 Error 类并修正 constructor
直接用 class MyError extends Error 是基础,但必须在构造函数中调用 super(message),并手动修复 constructor 属性(尤其在旧环境或使用某些打包工具时)。否则 instanceof 可能失效,error.constructor.name 也可能异常。
- ✅ 正确写法:
class ValidationError extends Error {
constructor(message) {
super(message);
this.name = 'ValidationError';
// 确保 constructor 指向当前类(TypeScript/现代 JS 通常自动处理,但显式设置更稳妥)
if (Error.captureStackTrace) {
Error.captureStackTrace(this, ValidationError);
} else {
this.stack = new Error(message).stack;
}
}
}
添加业务相关属性,避免污染 message
自定义错误应把结构化信息作为实例属性(如 code、details、field),而不是拼接到 message 字符串里。这样上层可通过属性精准判断类型,日志系统也能结构化采集。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 推荐:
class ApiError extends Error {
constructor(message, { code = 'UNKNOWN', status = 500, details = {} } = {}) {
super(message);
this.name = 'ApiError';
this.code = code; // 如 'NOT_FOUND', 'VALIDATION_FAILED'
this.status = status; // HTTP 状态码
this.details = details; // 额外上下文,如 { field: 'email', reason: 'invalid_format' }
}
}
// 使用
throw new ApiError('User not found', { code: 'USER_NOT_FOUND', status: 404 });
统一错误工厂函数(可选但实用)
当项目中自定义错误种类较多时,可用一个工厂函数集中管理创建逻辑,避免重复代码,也方便后期加统一行为(如自动上报、添加请求 ID)。
立即学习“Java免费学习笔记(深入)”;
- ✅ 示例:
function createError(Class, message, props = {}) {
const err = new Class(message);
Object.assign(err, props);
return err;
}
// 使用
throw createError(ValidationError, 'Email is required', { field: 'email' });
避免常见反模式
❌ 不要只 throw 字符串:throw 'Invalid token' —— 丢失类型、堆栈难追踪;
❌ 不要重写 toString() 或修改 message getter 而不维护堆栈;
❌ 不要在自定义错误中抛出新错误来“增强”堆栈(如 super(new Error(...))),会破坏原始堆栈。
规范的自定义错误让 try/catch 更可靠,配合 Sentry 或前端监控平台时,也能准确分类、告警和溯源。

















