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

useEffect内调用API获取数据时的错误处理方案

问题原因

你现有代码的错误是try/catch的放置位置错误:你将同步执行的useEffect钩子调用包裹在try/catch中,而异步请求的错误发生在后续执行的getData异步函数内部,属于异步微任务,外层的同步try/catch完全无法捕获到这部分错误。

正确的try/catch使用方式

将try/catch放在异步函数内部,包裹await请求逻辑即可捕获异常,同时需要注意GraphQL接口的特殊规则:即使请求返回200状态码,也可能在响应体中携带业务错误,需要额外判断处理:

async function contactAPI() {
  return await axios({
    url: 'https://graphqlexample.com/products/api',
    method: 'post',
    data: {
      query: `
      QUERY GOES HERE
        `
    }
  })
}

function App() {  
  const [products, setProducts] = useState([]);
  // 可新增错误状态用于前端页面提示用户
  const [error, setError] = useState(null);

  useEffect(() => {
    async function getData() {
      try {
        const resp = await contactAPI();
        // 处理GraphQL返回的业务错误
        if (resp.data.errors) {
          throw new Error(resp.data.errors.map(item => item.message).join(';'))
        }
        setProducts(resp.data.data.products);
      } catch (err) {
        console.log("there was an error:", err);
        setError(err);
      }
    }
    getData();
  }, []);    

  return (
    // JSX GOES HERE
  );
}
更合适的错误处理方案
  • 也可以不用async/await语法,直接在Promise链末尾加.catch()处理错误:contactAPI().then(resp => { // 处理响应 }).catch(err => { // 处理错误 })
  • 如果项目请求逻辑较多,推荐使用React Query、SWR这类专门的请求状态管理库,内置了统一的错误处理、重试、缓存能力,不需要手动维护异步请求的各类边界状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:02