You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建自定义Error对象而非字符串,实现API错误消息标准化?

如何构建自定义Error对象而非传入字符串?

你希望在catch块中抛出包含status和message的结构化错误对象,以此统一不同API的错误格式对吧?这里有两种可行的实现方式,推荐你优先选择第一种:

一、自定义继承自Error的类(最佳实践)

这种方式能保留原生Error的所有特性(比如调用栈跟踪),同时让你清晰地标识错误类型,后续处理错误时也更方便区分。

代码示例:

class ApiError extends Error {
  constructor(status, message) {
    super(message); // 调用原生Error的构造函数,设置错误消息
    this.name = 'ApiError'; // 自定义错误名称,方便识别错误类型
    this.status = status; // 添加你需要的自定义状态码属性
    // 确保调用栈跟踪的正确性(部分JS环境需要手动处理)
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, ApiError);
    }
  }
}

async function getUrl() {
  try {
    const res = await axios.get('https://httpstat.us/500');
  } catch(e) {
    const errorObj = { status: 500, message: 'Internal server error, something is not defined etc' };
    // 抛出自定义的ApiError实例
    throw new ApiError(errorObj.status, errorObj.message);
  }
}

// 后续处理错误的示例
try {
  await getUrl();
} catch(err) {
  if (err instanceof ApiError) {
    console.log(`API错误:状态码${err.status},消息:${err.message}`);
  } else {
    // 处理其他类型的非API错误
    console.error('未知错误:', err);
  }
}

二、给原生Error实例添加自定义属性(不推荐)

如果你暂时不想自定义类,也可以直接给原生Error实例附加属性,但这种方式不够规范,无法通过instanceof精准区分错误类型,在一些严格环境中可能出现兼容性问题:

async function getUrl() {
  try {
    const res = await axios.get('https://httpstat.us/500');
  } catch(e) {
    const errorObj = { status: 500, message: 'Internal server error, something is not defined etc' };
    const err = new Error(errorObj.message);
    // 给原生Error实例添加自定义属性
    err.status = errorObj.status;
    throw err;
  }
}

// 处理错误的示例
try {
  await getUrl();
} catch(err) {
  if (err.status) { // 只能通过是否存在status属性来判断
    console.log(`API错误:状态码${err.status},消息:${err.message}`);
  } else {
    console.error('其他错误:', err);
  }
}

总结

  • 强烈推荐使用自定义Error类的方式,它更符合JavaScript错误处理的最佳实践,代码的可维护性和扩展性更强。
  • 不要尝试修改原生Error类的原型,这会污染全局环境,引发不可预见的问题。

内容的提问来源于stack exchange,提问作者user9728810

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:33:56