Files
xiaomihome/miot/migration/07-miot-err.md
T
4566704 3a44cb9e6a feat: 初始化小米 IoT (MIoT) 智能家居 Go 库
- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写)
- 支持云端 API 调用与局域网设备发现(mDNS)
- 集成国际化(i18n)多语言支持
- 添加 MIoT 设备规约解析器(spec_parser)
- 包含单元测试与使用示例
2026-06-28 22:05:49 +08:00

217 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 07 - miot_error.py 移植计划
## 概览
| 项目 | 内容 |
|------|------|
| **Python 文件** | `py-miot/miot_error.py` (151行) |
| **Go 文件** | `go-miot/miot_error.go` |
| **状态** | ✅ 已完成 (仅缺测试) |
| **优先级** | 🔴 P0 |
| **预计工作量** | 2-3 小时 |
## Python 版本分析
### 核心类
#### MIoTErrorCode
**位置**:第 52-80 行
**功能**:错误码枚举
**错误码列表**:
| 错误码 | 名称 | 值 | 说明 |
|--------|------|-----|------|
| `CODE_UNKNOWN` | -10000 | 未知错误 |
| `CODE_UNAVAILABLE` | -10001 | 不可用 |
| `CODE_INVALID_PARAMS` | -10002 | 无效参数 |
| `CODE_RESOURCE_ERROR` | -10003 | 资源错误 |
| `CODE_INTERNAL_ERROR` | -10004 | 内部错误 |
| `CODE_UNAUTHORIZED_ACCESS` | -10005 | 未授权访问 |
| `CODE_TIMEOUT` | -10006 | 超时 |
| `CODE_OAUTH_UNAUTHORIZED` | -10020 | OAuth 未授权 |
| `CODE_HTTP_INVALID_ACCESS_TOKEN` | -10030 | HTTP 无效 access token |
| `CODE_MIPS_INVALID_RESULT` | -10040 | MIPS 无效结果 |
| `CODE_CERT_INVALID_CERT` | -10050 | 证书无效 |
| `CODE_CONFIG_INVALID_INPUT` | -10100 | 配置无效输入 |
| `CODE_CONFIG_INVALID_STATE` | -10101 | 配置无效状态 |
| `CODE_LAN_UNAVAILABLE` | -10120 | LAN 不可用 |
#### MIoTError
**位置**:第 82-98 行
**功能**:基础错误类
**核心方法**:
| 方法名 | 行号 | 功能 |
|--------|------|------|
| `__init__` | 87 | 初始化错误 |
| `to_str` | 94 | 转换为 JSON 字符串 |
| `to_dict` | 97 | 转换为字典 |
#### 子类错误
| 类名 | 行号 | 说明 |
|------|------|------|
| `MIoTOauthError` | 101 | OAuth 错误 |
| `MIoTHttpError` | 105 | HTTP 错误 |
| `MIoTMipsError` | 109 | MIPS 错误 |
| `MIoTDeviceError` | 113 | 设备错误 |
| `MIoTSpecError` | 117 | SPEC 错误 |
| `MIoTStorageError` | 121 | 存储错误 |
| `MIoTCertError` | 125 | 证书错误 |
| `MIoTClientError` | 129 | 客户端错误 |
| `MIoTEvError` | 133 | 事件错误 |
| `MipsServiceError` | 137 | MIPS 服务错误 |
| `MIoTConfigError` | 141 | 配置错误 |
| `MIoTOptionsError` | 145 | 选项错误 |
| `MIoTLanError` | 149 | LAN 错误 |
## Go 版本现状
### 缺失的功能
整个 `miot_error.py` 模块在 Go 版本中完全缺失。
Go 版本中可能需要实现:
1. **错误码定义** - 对应 `MIoTErrorCode`
2. **基础错误类** - 对应 `MIoTError`
3. **子类错误** - 对应各种专用错误类
## 移植建议
### 第一批任务(核心功能)
1. **创建 `miot_error.go` 文件** (1小时)
- 定义错误码常量
- 定义 `MIoTError` 结构体
- 实现 `Error()` 方法
2. **实现错误码** (1小时)
- 定义所有错误码常量
- 使用 `iota` 简化定义
3. **实现子类错误** (1小时)
- 定义各种专用错误类型
- 实现构造函数
### 第二批任务(辅助功能)
4. **实现错误转换** (1小时)
- 实现 `ToStr()` 方法
- 实现 `ToDict()` 方法
5. **单元测试** (1小时)
- 测试错误创建
- 测试错误转换
## 技术难点
### 1. 错误类型设计
**问题**:Go 的错误类型设计与 Python 不同
**建议**:
```go
type MIoTErrorCode int
const (
CodeUnknown MIoTErrorCode = -10000
CodeUnavailable MIoTErrorCode = -10001
// ...
)
type MIoTError struct {
Code MIoTErrorCode
Message string
}
func (e *MIoTError) Error() string {
return fmt.Sprintf("code=%d, message=%s", e.Code, e.Message)
}
func (e *MIoTError) ToDict() map[string]interface{} {
return map[string]interface{}{
"code": e.Code,
"message": e.Message,
}
}
```
### 2. 子类错误
**问题**:Go 没有继承,需要使用组合或类型别名
**建议**:
```go
type MIoTOauthError struct {
MIoTError
}
type MIoTHttpError struct {
MIoTError
}
// 或者使用函数构造函数
func NewMIoTOauthError(message string) *MIoTOauthError {
return &MIoTOauthError{
MIoTError: MIoTError{
Code: CodeOauthUnauthorized,
Message: message,
},
}
}
```
## 测试计划
### 单元测试
1. **错误创建测试**
- 测试基础错误
- 测试子类错误
2. **错误转换测试**
- 测试 `Error()` 方法
- 测试 `ToDict()` 方法
3. **错误处理测试**
- 测试错误类型判断
- 测试错误链
## 依赖关系
| 依赖文件 | 关系 | 说明 |
|---------|------|------|
| 无 | - | 独立模块 |
## 移植优先级
| 任务 | 优先级 | 理由 |
|------|--------|------|
| 创建基础结构 | 🔴 高 | 基础框架 |
| 实现错误码 | 🔴 高 | 核心功能 |
| 实现子类错误 | 🔴 高 | 核心功能 |
| 实现错误转换 | 🟡 中 | 辅助功能 |
| 单元测试 | 🟡 中 | 质量保障 |
## 进度跟踪
- [x] 创建 `miot_error.go` 文件 (2026-06-28)
- [x] 实现错误码 (2026-06-28)
- [x] 实现子类错误 (2026-06-28)
- [x] 实现错误转换 (ToDict) (2026-06-28)
- [ ] 单元测试 (预计 1小时)
**总计**:5小时 (已完成 4/5)
---
**创建时间**:2026-06-28
**最后更新**:2026-06-28
**负责人**:待定