# rpc 错误：code = Canceled desc = 上下文已取消

- **ID:** `go/grpc-context-canceled-client`
- **领域:** go
- **类别:** network_error
- **验证级别:** ai_generated
- **修复率:** 80%

## 根因

客户端在 RPC 完成前取消了上下文（例如 HTTP 请求中止、父 ctx 超时或显式调用 cancel()）。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| google.golang.org/grpc v1.50+ | active | — | — |

## 解决方案

1. **** (90% 成功率)
   ```
   resp, err := client.Get(ctx, req)
if err != nil {
    if errors.Is(ctx.Err(), context.Canceled) {
        log.Printf("caller canceled: %v", ctx.Err())
        return nil, err
    }
    if status.Code(err) == codes.Canceled {
        return nil, status.Error(codes.Canceled, "server canceled RPC")
    }
    return nil, err
}
   ```
2. **** (88% 成功率)
   ```
   for {
    select {
    case <-ctx.Done():
        return nil, status.FromContextError(ctx.Err()).Err()
    default:
        // do work
    }
}
   ```

## 无效尝试

- **** — If the caller canceled, the retry will also be canceled immediately — wasted work. (90% 失败率)
- **** — Loses parent deadline/cancellation propagation; goroutines leak on client disconnect. (85% 失败率)
