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

ErrorBoundary未捕获API调用抛出的ERR-401错误问题排查

问题原因与解决方案

核心原因

React(包括Expo Router的ErrorBoundary)默认仅捕获同步渲染阶段抛出的错误。你的customInstance中401错误是异步Promise拒绝,当这个Promise没有被组件内的错误处理机制正确传递到ErrorBoundary的捕获流程时,就会变成未处理的Promise拒绝,导致控制台警告且ErrorBoundary无法捕获。路由迭代后请求的执行上下文或时机变化,导致之前隐式的错误传递逻辑失效。

具体解决方法

1. 利用SWR的错误边界集成(适配你的代码场景)

因为你的customInstance包含SWR取消请求的逻辑,直接在SWR配置中开启useErrorBoundary选项,让SWR自动将异步错误抛给ErrorBoundary:

// 在调用customInstance的组件中
import useSWR from 'swr';

const { data } = useSWR('/your-api-path', customInstance, {
  useErrorBoundary: true, // 关键配置:将异步错误交给ErrorBoundary处理
});

2. 确保ErrorBoundary的层级覆盖请求组件

检查Expo Router的路由结构,确保发起API请求的所有页面/组件都处于rootLayout的ErrorBoundary子树中。如果请求是在某个布局组件(如layout.tsx)中发起的,需确认该布局组件在ErrorBoundary的包裹范围内。

3. 组件内手动捕获异步错误并同步抛出

如果未使用SWR,可在组件内通过useState存储错误,然后在渲染阶段同步抛出,让ErrorBoundary捕获:

import { useState, useEffect } from 'react';

function YourComponent() {
  const [apiError, setApiError] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      try {
        await customInstance({ url: '/your-api-path' });
      } catch (err) {
        setApiError(err);
      }
    };
    fetchData();
  }, []);

  // 同步抛出错误,触发ErrorBoundary
  if (apiError) {
    throw apiError;
  }

  return <View>{/* 组件内容 */}</View>;
}

4. 验证错误抛出的正确性

确保customInstance中抛出的是标准Error对象(你当前代码中throw Error('ERR-401')是正确的),避免抛出普通对象,确保ErrorBoundary能正确识别错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:52:03