跳到主要内容

11. 错误处理

11. 错误处理 (Error Handling)

检测到错误的 endpoint SHOULD 向其 peer 发出存在该错误的信号. transport-level 和 application-level error 都可能影响整个连接; 参见第 11.1 节. 只有 application-level error 可以被隔离到单个 stream; 参见第 11.2 节.

发出错误信号的 frame 中 SHOULD 包含最合适的 error code (第 20 节). 本规范在标识错误条件时, 也会标识所使用的 error code.

对于任何能够用 CONNECTION_CLOSE 或 RESET_STREAM frame 发出信号的错误, stateless reset (第 10.3 节) 都不适用. 如果 endpoint 拥有在连接上发送 frame 所需的状态, 则 MUST NOT 使用 stateless reset.

11.1 连接错误 (Connection Errors)

导致连接不可用的错误, 例如明显违反协议语义, 或影响整个连接的状态损坏, MUST 使用 CONNECTION_CLOSE frame (第 19.19 节) 发出信号.

即使错误只影响单个 stream, endpoint 也 MAY 以这种方式关闭连接.

endpoint MUST 限制其发送的 error frame 数量. endpoint MAY 在只包含该 frame 的 packet 中发送 CONNECTION_CLOSE frame, 并且在收到 CONNECTION_CLOSE frame 后 SHOULD 以这种方式响应.

11.2 流错误 (Stream Errors)

如果 application-level error 只影响单个 stream, 且连接在其他方面仍处于可恢复状态, endpoint 可以发送带有适当 error code 的 RESET_STREAM frame (第 19.4 节), 仅终止受影响的 stream.

RESET_STREAM MUST 由应用触发, 但发送 RESET_STREAM 的原因可以包括 transport 在 stream 中检测到错误.

除 RESET_STREAM 外, endpoint MUST NOT 在处于 "Reset Sent" 状态或任何终止状态的 stream 上发送 frame, 也就是在发送 RESET_STREAM frame 之后不得发送.