# 错误处理

URL: https://caijiao.org/ky/error-handling
Source: docs/ky/error-handling.md
Description: 学习如何在 Ky 中捕获和处理请求错误，包括网络错误、HTTP 状态错误和自定义错误处理。

在前端请求中，错误处理是必不可少的。Ky 提供统一的错误处理机制，支持捕获网络错误、HTTP 状态码错误和自定义处理逻辑。

## 捕获错误

使用 `try...catch` 捕获请求异常：

```javascript
import ky from 'ky';

async function fetchData() {
  try {
    const data = await ky.get('https://api.example.com/data').json();
    console.log(data);
  } catch (error) {
    console.error('请求出错:', error);
  }
}

fetchData();
````

## Ky 错误对象

* **HTTPError**：当 HTTP 响应状态码非 2xx 时抛出
* **TimeoutError**：请求超时时抛出
* **AbortError**：请求被取消时抛出

```javascript
try {
  await ky.get('https://api.example.com/data', { timeout: 1000 }).json();
} catch (error) {
  if (error.name === 'HTTPError') {
    console.error('HTTP 错误:', error.response.status);
  } else if (error.name === 'TimeoutError') {
    console.error('请求超时');
  } else if (error.name === 'AbortError') {
    console.error('请求被取消');
  } else {
    console.error('未知错误:', error);
  }
}
```

## 自定义错误处理

可以通过 `hooks` 在响应后统一处理错误：

```javascript
const api = ky.create({
  hooks: {
    afterResponse: [
      (request, options, response) => {
        if (!response.ok) {
          console.error(`请求 ${request.url} 返回状态码 ${response.status}`);
        }
      }
    ]
  }
});
```

## 小结

* 使用 `try...catch` 捕获请求异常。
* Ky 提供不同类型的错误对象，便于分类处理。
* 可通过实例的 `hooks` 实现统一错误处理逻辑。
