错误

本部分介绍了 Zircon 中使用的一组存在用户空间的错误。第一部分提供每个错误代码的规范名称和说明。第二部分提供具体的值。

在内核中,错误通常由 status_t 类型的变量导致,而错误则由 ZX_ERR_CANONICAL_NAME 格式的宏(例如 ZX_ERR_INTERNAL)定义。所有错误情况均为负值,成功用非负值表示。

在用户空间中,系统调用调度层 (libzircon) 将结果值公开为 zx_status_t 类型的变量,这些变量目前使用与内核相同的拼写和值来表示错误,但对于错误,将转为使用 0 表示成功,并使用正值表示错误。

如需查看内核内部值的列表,请参阅内核内部错误

说明

每个类别表示一类错误。每个类别中的第一个错误代码是相应类别的通用代码,在没有更具体的代码适用时使用。某个类别中的其他错误代码(如果有)表示相应类中特定类型的错误。一般而言,应尽可能选择更具体的错误代码。

错误根据操作、参数、主题和标识符进行描述。操作通常是函数或系统调用。实参通常是调用的参数。操作对象是指操作对其执行操作的主要对象,通常是句柄,通常作为第一个参数传递。标识符通常是数字或字符串,用于明确标识操作中使用的资源。

类别

成功

ZX_OK 操作成功。

常规错误

这些错误消息表示系统在尝试操作时遇到了常规错误。

INTERNAL 系统在执行此操作时遇到其他未指定的错误。

NOT_SUPPORTED 操作不受支持、实现或未启用。

NO_RESOURCES 系统无法分配执行操作所需的某些资源。

NO_MEMORY 系统无法分配操作所需的内存。

参数错误

这些指示调用方指定的参数未指定有效操作,或者对指定操作无效。

INVALID_STRING 参数无效。

WRONG_TYPE 操作主题的类型不正确,无法执行操作。 示例:尝试对线程句柄执行 message_read。

BAD_SYSCALL 指定的系统调用号码无效。

BAD_HANDLE 指定的句柄值并不引用句柄。

OUT_OF_RANGE 参数超出了此操作的有效范围。注意:当参数在系统更改状态时可能有效时,将使用此参数,这与 INVALID_STRING 不同,此参数在参数永远无效时使用。

BUFFER_TOO_SMALL 调用方提供的缓冲区太小,无法执行此操作。

前提条件或状态错误

这表明操作无法成功,因为操作的前提条件不满足,或者系统无法在当前状态下完成操作。

BAD_STATE 系统无法在当前状态下执行操作。 注意:FAILED_PRECONDITION 是此错误的保留别名

NOT_FOUND:找不到请求的实体。

TIMED_OUT 操作完成前所经过的操作时间限制。

ALREADY_EXISTS 具有指定标识符的对象已存在。 示例:如果已存在同名文件,则尝试创建文件。

ALREADY_BOUND 由于命名实体已由另一实体拥有或控制,因此操作失败。 稍后,如果当前所有者释放该实体,操作可能会成功。

HANDLE_CLOSED 正在等待的句柄已关闭。

PEER_CLOSED 操作失败,因为操作对象的远程端已关闭。

UNAVAILABLE 操作对象目前无法执行此操作。 注意:如果调用方无法直接观察到主题何时能够执行操作并因此应重试,则使用此方法。

SHOULD_WAIT 操作当前无法执行,但如果调用方等待满足前提条件,例如等待句柄可读取或可写入,则可能成功执行。 示例:如果尝试从没有消息等待状态但有打开的遥控器的通道读取数据,将返回 SHOULD_WAIT。如果尝试从没有消息等待且远程端已关闭的通道读取数据,将返回 PEER_CLOSED

权限错误

ACCESS_DENIED 调用方无权执行指定的操作。

输入/输出错误

IO I/O 期间发生其他不明错误。

IO_REFUSED 正在进行 I/O 操作的实体拒绝了操作。示例:I2C 设备 NAK 事务或磁盘控制器拒绝无效命令。

IO_DATA_INTEGRITY 操作中的数据未通过完整性检查,可能已损坏。 示例:CRC 或奇偶性错误。

IO_DATA_LOSS 操作中的数据目前不可用,可能会永久丢失。 示例:磁盘块以不可恢复的方式损坏。