第 20 章:错误处理
本章规定读取器、写入器和编辑器遇到不完整、损坏、未知或不兼容数据时的行为。核心原则是:不猜测权威语义,不用缓存伪造资产,不因可选表现问题丢弃有效权威数据。
20.1 读取器行为
| 问题类别 | 行为 |
|---|---|
| Header/Footer/Directory 无效 | 必须拒绝整个文件 |
| 必需区段缺失、重复、越界或 CRC 失败 | 必须拒绝资产 |
| META/PAL0/CHIX/VOX0 语义冲突 | 必须拒绝资产 |
| 未知必需 Tag、Codec 或 Flag | 必须拒绝资产 |
| 未知可选区段 | 可忽略并记录 Warning |
| 缓存损坏、过期或不支持 | 必须丢弃缓存,回退权威数据 |
| SCNE/ANM0/BORD/PRVW/THMB 失败 | 可忽略对应区段并继续加载 |
读取器不得因为“画面看起来正常”而绕过 CRC32、Source Hash 或 Palette 引用错误。
20.2 资源与安全限制
实现必须为不可信文件设置上限,包括最大文件长度、Directory Entry 数量、每个 Payload 的存储和解码长度、字符串长度、Chunk 数、顶点数和预览像素数。应先验证长度和乘法,再进行内存分配。
RLE8 解码必须检测零长度 Run、累积溢出和不足。预览与 GLB 解析必须禁止不受控的外部加载。解析器不得根据文件内声明直接分配无限内存或递归处理无限层数据。
20.3 写入器行为
写入器发现输入不满足 VFP 1.3 限制时必须失败并提供可诊断原因,或执行调用方显式选择的量化/拆分策略。写入器不得输出未知 Flag、非零保留字段、引用不存在 Chunk 的缓存、或与 META Source Hash 不一致的缓存。
建议采用“临时文件 → 完整验证 → 原子替换”的保存流程。追加式保存时,写入器必须确保新 Footer 是最后写入且完整的结构。
20.4 错误传播
错误消息应包含错误代码、文件偏移(如适用)、Tag、Chunk ID、字段名、期望值和实际值。编辑器应将权威数据错误视为不可继续编辑;仅缓存错误可提示用户重建缓存或继续编辑。
本章总结
VFP 的错误处理以资产真实性优先:宁可明确拒绝无法验证的权威数据,也不能用过期缓存或猜测结果制造看似可用的资产。