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

API请求场景下JavaScript错误处理:如何可靠区分自定义与原生错误?

更可靠的自定义错误消息判断方案

你的核心需求是仅展示后端返回的自定义错误消息,忽略原生JS错误或请求层面的非自定义错误,原来的逻辑确实逻辑颠倒且不可靠——因为原生错误必然有err.message,而自定义API错误通常也会携带err.message(比如Axios封装的请求错误),所以不能用err.message的存在与否来判断。

推荐两种更严谨的实现方式:

方式一:直接检查自定义错误的特征字段

自定义API错误的核心特征是存在err.response(请求已到达后端并返回响应),且响应数据里有message字段。可以按优先级判断:

// 假设GENERIC_ERROR是你定义的默认兜底提示
const error = err?.response?.data?.message || GENERIC_ERROR;
  • 逻辑:如果存在后端返回的自定义消息就用它,否则直接用兜底提示(原生错误会走到兜底,不会暴露原生错误信息)
  • 优势:简洁直观,精准命中自定义错误场景,避免误判

方式二:自定义错误类(更规范的工程化方案)

如果是大型项目,建议封装自定义错误类,从请求拦截器里抛出,这样可以直接通过instanceof判断:

// 定义自定义API错误类
class ApiError extends Error {
  constructor(message) {
    super(message);
    this.name = 'ApiError';
  }
}

// 在请求响应拦截器中处理(以Axios为例)
axios.interceptors.response.use(
  response => response,
  err => {
    if (err.response?.data?.message) {
      // 后端返回自定义错误,抛出自定义错误实例
      throw new ApiError(err.response.data.message);
    }
    // 其他错误直接抛出(或转为兜底错误)
    throw new ApiError(GENERIC_ERROR);
  }
);

// 业务代码中捕获错误
try {
  await apiRequest();
} catch (err) {
  const error = err instanceof ApiError ? err.message : GENERIC_ERROR;
  // 展示error
}
  • 优势:类型清晰,扩展性强,后续可以给ApiError添加更多字段(比如错误码、状态码),便于错误分类处理

注意事项

  • 不要直接暴露原生错误消息给用户,避免泄露技术细节
  • 兜底提示GENERIC_ERROR建议使用友好的用户提示,比如“请求失败,请稍后再试”

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:02:08